Пока я пытался выучить 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()
, но, похоже, не все так просто:)
- Я не могу пройти
func()(*http.Request, error)
где fun c () (interface {}, error) ожидается - в любом случае
Do(func() (string, error) {return "a", nil}..
не компилировать либо - На самом деле мне все равно, что передается на предыдущий вызов, если следующий вызывающий может его обработать - возможно, какие-то генерики были бы полезны, но я не нашел в документации ничего об этом.
- Я не могу позвонить
.onSuccessMap/.onXXX/..
, вероятно, потому что я возвращаю *Op
вместо Op
- если я явно разыменую *Op
, может быть, я не должен возвращать *Op
в первую очередь - могу ли я как-то упростить функцию поставщиков, чтобы мне не приходилось передавать всю эту информацию - было бы неплохо, если бы компилятор выяснил, что происходит
возможно я слишком много думайте java, а не go, любые комментарии / подсказки будут очень полезны. может быть, вся идея не имеет смысла:]