Создание метода, который принимает любое значение - PullRequest
0 голосов
/ 23 февраля 2020

Пока я пытался выучить Go (версия 1.13), я пытался реализовать базовую c сетевую работу, но устал от if err! = Nil и решил стать немного умнее и создал что-то вроде этого

package operation

type Op struct {
    err error
    result interface{}
}

func Do(supplier func() (interface{}, error)) *Op {
    result, err := supplier()
    return &Op {result: result, err: err}
}

func (op *Op) onSuccessMap(supplier func(input interface{}) (interface{}, error)) *Op {
    if op.err != nil {
        return op
    } else {
        r, e := supplier(op.result)
        return &Op{result: r, err: e}
    }
}

func (op *Op) onFailure(errorHandler func(error) (interface{}, error)) *Op {
    if op.err == nil {
        return op
    } else {
        newResult, err := errorHandler(op.err)
        return &Op{result: newResult, err: err}
    }
}

func (op *Op) get() (interface{}, error) {
    return op.result, op.err
}

и я хотел назвать это как

r,e := operation.Do(func()(*http.Request, error){
        return http.NewRequest("GET", "http://target.com", nil)
    })
    .onSuccessMap(func(req *http.Request)(*http.Response, error) {
        //... do something with request
    })
    .onSuccessMap(func(req *http.Response)(MyDomain, error) {
        //... do something with response
    })
    .onFailure(func(e error) (interface{}, error) {
        // .. optionally do something with first error
    }).get()

, но, похоже, не все так просто:)

  1. Я не могу пройти func()(*http.Request, error) где fun c () (interface {}, error) ожидается
  2. в любом случае Do(func() (string, error) {return "a", nil}.. не компилировать либо
  3. На самом деле мне все равно, что передается на предыдущий вызов, если следующий вызывающий может его обработать - возможно, какие-то генерики были бы полезны, но я не нашел в документации ничего об этом.
  4. Я не могу позвонить .onSuccessMap/.onXXX/.., вероятно, потому что я возвращаю *Op вместо Op - если я явно разыменую *Op, может быть, я не должен возвращать *Op в первую очередь
  5. могу ли я как-то упростить функцию поставщиков, чтобы мне не приходилось передавать всю эту информацию - было бы неплохо, если бы компилятор выяснил, что происходит

возможно я слишком много думайте java, а не go, любые комментарии / подсказки будут очень полезны. может быть, вся идея не имеет смысла:]

1 Ответ

1 голос
/ 23 февраля 2020

Эти вопросы и ответы основаны на мнениях, но я предлагаю не дополнять ваши собственные обработчики ошибок таким образом.

Так как вы используете go 1.13, я Настоятельно рекомендую прочитать новые функции обработки ошибок в go -blog .

. Он позволяет объединять ошибки в цепочки и легко развернуть любой тип ошибки из цепочки ошибок. С errors.Is можно определить, произошел ли конкретный тип ошибки. С помощью errors.As вы можете извлечь точные сведения об этой ошибке.

fmt.Errorf с помощью %w - это быстрый способ создания ваших собственных ошибок. А если вам нужно больше подробностей об ошибках, вы можете просто написать свои собственные типы ошибок, если они включают интерфейсы Error и Wrap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...