如何在结构体值赋值期间省略函数调用的二次返回

LuS*_*axy 1 go

我想在 struct 类型的变量声明中分配一个值,但是,我需要调用一个返回辅助值(错误)的函数,我想在赋值中忽略该值。

有办法这样做吗?例如:

type myStruct struct{
    address common.Address
}


func main() {
    newVar := myStruct{
      address: common.HexToAddress("xyz") 
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是common.HexToAddress()返回 2 个值,一个 common.Address 以及一个错误。我想忽略该错误并按上面的方式分配它。我宁愿不必这样做:

var newVar2 myStruct
myStruct,_ = common.HexToAddress("xyz") 
Run Code Online (Sandbox Code Playgroud)

小智 5

通常并不完全建议忽略错误,这可能是该语言不能使这一点变得容易的原因之一。

话虽如此,您有时看到的模式是提供Must功能的包,对于那些只对panic()错误执行 a 的情况是正确的做法;例如,在初始化包级变量时。

例如,有text/template.Must。该实现只是测试错误并在错误不为零时发生恐慌。您也可以考虑添加这样的函数(可能在文件本地),允许您将结构初始化编写为:

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

这依赖于这样的功能:如果一个函数返回多个值,而另一个函数采用相同数量的参数,则可以直接在前一个函数的返回值上调用后者

如果您不想走那么远,则需要通过将第二个返回值分配给空白标识符来显式忽略它_。您当然可以单独执行此操作,以便您仍然可以使用结构文字,但它可能不会比您最初建议的更清晰:

address, _ := common.HexToAddress("xyz")
newVar := myStruct{address: address}
Run Code Online (Sandbox Code Playgroud)