Go语言 如何在结构值赋值过程中省略函数调用的二次返回

okxuctiv  于 5个月前  发布在  Go
关注(0)|答案(3)|浏览(58)

我想在struct类型的变量声明中赋值,但是,我需要调用一个函数,该函数返回一个次要值(错误),我想在赋值时忽略该值。
有没有办法做到这一点?例如:

type myStruct struct{
    address common.Address
}

func main() {
    newVar := myStruct{
      address: common.HexToAddress("xyz") 
    }
}

字符串
问题是common.HexToAddress()返回2个值,一个公共.地址和一个错误。我想省略错误并如上所述分配它。我宁愿不必这样做:

var newVar2 myStruct
myStruct,_ = common.HexToAddress("xyz")

whlutmcx

whlutmcx1#

通常不建议忽略错误,这可能是语言不容易做到这一点的原因之一。
也就是说,你有时会看到一个模式是一个提供Must函数的包,对于那些只在错误上执行panic()是正确的事情的情况;例如,当初始化包级变量时。
例如,有text/template. Must。implementation简单地测试错误,如果它不是nil,就会死机。你也可以考虑添加这样一个函数(可能在你的文件本地),允许你将结构体初始化写为:

newVar := myStruct{
  address: must(common.HexToAddress("xyz")),
}
// ...
func must(address common.Address, err error) common.Address { ... }

字符串
这依赖于一个特性,即如果一个函数返回多个值,而另一个函数接受相同数量的参数,则可以直接在前者的返回值上调用后者。
如果你不想走那么远,你需要显式地忽略第二个返回值,把它赋给空标识符_。当然,你可以单独这样做,这样你仍然可以使用结构体文字,但它可能不会比你最初建议的更干净:

address, _ := common.HexToAddress("xyz")
newVar := myStruct{address: address}

ghg1uchk

ghg1uchk2#

你可能在寻找某种语法糖。Go语言故意在这方面很稀疏,因为在语言设计者看来,这往往会使事情变得不那么明显,因此可读性较差。所以你在这里的选择有限。
如果你真的不关心错误,这里是你的选择:
按照你的建议赋值给一个临时变量(通常是最自然/可读的选项):

addr, _ := common.HexToAddress("xyz")
newVar := myStruct{
    address: addr,
}

字符串
使用匿名函数的返回值:

newVar := myStruct{
    address: func() common.Address { addr, _ := common.HexToAddress("xyz"); return addr }(),
}


如果您控制common包,请考虑添加一个忽略(或panics)错误的变体:

newVar := myStruct{
    address: common.MustHexToAddress("xyz"),
}


编写你自己的wrapper函数:

func hexToAddress(hex string) common.Address {
    addr, _ := common.HexToAddress(hex)
    return addr
}

newVar := myStruct{
    address: hexToAddress("xyz"),
}

dffbzjpn

dffbzjpn3#

Go从v1.18开始支持泛型。你也可以这样做:

func must[T any](x T, _ error) T {
    return x
}

...

newVar := myStruct{
      address: must(common.HexToAddress("xyz")) 
}

字符串
这将支持任何类型,对于任何返回2个值的函数(在go中很常见)。
请注意,这完全忽略了(可能的)错误-我将让读者在这里做出最好的决定。

相关问题