在某些源代码中,我发现了这一点:
if etherbase != (common.Address{}) {
return etherbase, nil
}
etherbase
的类型为common.Address
,它的定义如下:
// Lengths of hashes and addresses in bytes.
const (
HashLength = 32
AddressLength = 20
)
// Address represents the 20 byte address of an Ethereum account.
type Address [AddressLength]byte
问题是:在这种情况下,感觉异常是什么意思?为什么不能省略它们?像这样:
if etherbase != common.Address{} {
return etherbase, nil
}
答案 0 :(得分:10)
The Go Programming Language Specification
使用TypeName的复合文字产生解析歧义 LiteralType的形式显示为关键字和之间的操作数 “ if”,“ for”或“ switch”的块的大括号 语句,并且复合文字不包含在括号中, 方括号或花括号。在这种罕见的情况下,左括号 文字的错误地解析为引入块的 的陈述。为了解决歧义,复合文字必须 出现在括号内。
if x == (T{a,b,c}[i]) { … } if (x == T{a,b,c}[i]) { … }
在common.Address{}
块if
之前的模棱两可的复合文字{ … }
。
if etherbase != common.Address{} {
return etherbase, nil
}
在(common.Address{})
块{…}之前的明确的复合文字if
。
if etherbase != (common.Address{}) {
return etherbase, nil
}
例如,
package main
const AddressLength = 20
type Address [AddressLength]byte
func f(etherbase Address) (Address, error) {
// Unambiguous
if etherbase != (Address{}) {
return etherbase, nil
}
return Address{}, nil
}
func g(etherbase Address) (Address, error) {
// Ambiguous
if etherbase != Address{} {
return etherbase, nil
}
return Address{}, nil
}
func main() {}