gpt4 book ai didi

go - 惯用语 Go Happy Path

转载 作者:IT王子 更新时间:2023-10-29 02:27:23 28 4
gpt4 key购买 nike

假设我们有一个返回一些值和错误的函数。处理错误和值声明的首选方式是什么?

func example_a(data interface{}) (interface{}, error) {
var err error
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}

func example_b(data interface{}) (interface{}, error) {
if bytes, err := json.Marshal(data); err != nil {
return nil, err
} else {
// ...
return use(bytes), nil
}
}

func example_c(data interface{}) (result interface{}, err error) {
var bytes []byte
if bytes, err = json.Marshal(data); err != nil {
return
}
// ...
return use(bytes), nil
}

func example_d(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}

func example_dream(data interface{}) (interface{}, error) {
if bytes, err ≡ json.Marshal(data); err != nil {
return nil, err
}
// ...
return use(bytes), nil
}

Example A 很清楚,但它增加了 2 行。此外,我发现不清楚为什么在这种特殊情况下我们应该使用 var,同时 := 并不总是合适的。然后你想在行的某个地方重用 err 声明,我不喜欢拆分声明和赋值。

Example B 使用了 if-declare-test 语言特性,我认为这是值得鼓励的,但同时你被迫嵌套函数继续,违反了快乐路径原则,这也是受到鼓励。

示例 C 使用命名参数返回功能,它介于 A 和 B 之间。这里最大的问题是,如果您的代码库使用样式 B 和 C,那么很容易出错 :==,这可能会导致各种问题。

示例 D(从建议中添加)对我来说有与 C 相同的使用问题,因为我不可避免地会遇到以下问题:

func example_d(a, b interface{}) (interface{}, error) {
bytes, err := json.Marshal(a)
if err != nil {
return nil, err
}

bytes, err := json.Marshal(b) //Compilation ERROR
if err != nil {
return nil, err
}

// ...
return use(bytes), nil
}

因此,根据之前的声明,我必须修改我的代码以使用 :==,这使得查看和重构变得更加困难。

Example Dream 是我直觉上对 GO 的期望——没有嵌套,快速退出,没有太多冗长和变量重用。显然它无法编译。

通常 use() 被内联并多次重复该模式,从而加剧了嵌套或拆分声明问题。

那么处理这种多重返回和声明的最惯用的方法是什么?有没有我遗漏的模式?

最佳答案

如果您查看大量 Go 代码,您会发现以下是常见的情况:

func example(data interface{}) (interface{}, error) {
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
// ...
return use(bytes), nil
}

declare and test if 结构在它的位置上很好,但它通常不适合这里。

关于go - 惯用语 Go Happy Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024818/

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