gpt4 book ai didi

go - 创建接受任何值的方法

转载 作者:行者123 更新时间:2023-12-01 22:43:46 24 4
gpt4 key购买 nike

当我尝试学习 Go(1.13 版)时,我试图实现基本的网络操作,但我厌倦了 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)其中 func()(interface{}, error) 应为
  • 无论如何Do(func() (string, error) {return "a", nil}..也不编译
  • 如果下一个调用者可以处理它,我实际上并不关心提供给上一个调用的内容 - 可能某种泛型会很方便,但我在文档中没有找到任何关于它的内容。
  • 我无法调用 .onSuccessMap/.onXXX/..可能是因为我返回 *Op而不是Op - 我应该明确取消引用*Op ,也许我不应该返回 *Op第一名
  • 我可以以某种方式简化 vendor 功能,这样我就不必传递所有这些信息 - 如果编译器弄清楚发生了什么会很好

  • 也许我用java的方式想太多了,不走方式,
    任何评论/提示都会非常有帮助。也许整个想法没有意义:]

    最佳答案

    此问答非常基于意见,但我的建议是 不要以这种方式实现您自己的错误处理程序。

    由于您使用的是 go 1.13,我强烈建议您阅读 go-blog 中的新错误处理功能。 .

    它允许链接错误,并轻松地从错误链中解开任何特定的错误类型。与 errors.Is可以确定是否发生了特定的错误类型。与 errors.As您可以提取该错误的确切细节。
    fmt.Errorf%w是一种快速生成您自己的包装错误的方法。如果您想要更多错误详细信息,您可以简单地编写自己的错误类型,只要它们包括 ErrorWrap接口(interface)。

    关于go - 创建接受任何值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365363/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com