The Go Programming Language Specification
Index expressions
对于映射类型 M 的 a:如果映射为 nil 或不包含这样的
条目,a[x] 是 M 的元素类型的零值。
The zero value
当为变量分配存储空间时,无论是通过声明
或调用 new,或在创建新值时,通过
复合文字或 make 调用,并且没有显式初始化
提供,变量或值被赋予默认值。每个元素
这样一个变量或值的类型被设置为零值:
布尔值为 false,数字类型为 0,字符串为 "",nil 为
指针、函数、接口、切片、通道和映射。
The Go Programming Language Specification
Composite literals
复合字面量为结构、数组、切片和
映射并在每次评估时创建一个新值。它们包括
字面量的类型,后跟大括号绑定的元素列表。
每个元素可以可选地在一个相应的键之前。为了
结构文字适用以下规则:
文字可以省略元素列表;这样的文字评估为
其类型的值为零。
对于您的示例,键入 struct{},省略复合文字 struct{}{} 中的元素列表作为零值。
例如,
package main
import "fmt"
func main() {
m := map[string]struct{}{}
val, ok := m["foo"]
fmt.Printf("%T %v\n", val, val)
if val == struct{}{} {
fmt.Println("==", val, ok)
}
}
游乐场:https://play.golang.org/p/44D_ZfFDA77
输出:
struct {} {}
== {} false
The Go Programming Language Specification
Variable declarations
变量声明创建一个或多个变量,绑定
对应的标识符,并给每个人一个类型和一个
初始值。
如果给出了表达式列表,则变量被初始化为
遵循分配规则的表达式。否则,每个
变量被初始化为零值。
如果存在类型,则为每个变量指定该类型。否则,
每个变量都被赋予了相应的初始化类型
赋值中的值。
在您的示例中,您可以声明一个没有初始值的 struct{} 类型的变量,该变量将被初始化为 struct{} 类型的零值。
例如,
package main
import "fmt"
func main() {
m := map[string]struct{}{}
val, ok := m["foo"]
fmt.Printf("%T %v\n", val, val)
var zeroValue struct{}
if val == zeroValue {
fmt.Println("==", val, ok)
}
}
游乐场:https://play.golang.org/p/_XcSCEeEKJV
输出:
struct {} {}
== {} false