在这种情况下,括号是什么意思?

时间:2018-08-16 00:39:04

标签: go

在某些源代码中,我发现了这一点:

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
}

1 个答案:

答案 0 :(得分:10)

  

The Go Programming Language Specification

     

Composite literals

     

使用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() {}

游乐场:https://play.golang.org/p/G5-40eONgmD