struct 定义中的'do not compare' sentinel是什么类型?
type SomeStruct struct {
_ [0]func() // do not compare
...
}
[0]func()
到底是多少?func()
个对象的零长度切片?还有别的事吗?
struct 定义中的'do not compare' sentinel是什么类型?
type SomeStruct struct {
_ [0]func() // do not compare
...
}
[0]func()
到底是多少?func()
个对象的零长度切片?还有别的事吗?
好吧,考虑到我的 comments 也可以被认为是一个答案:
_ [0]func()
将被读取为类型为[0]func()
的未命名字段.它不是一个切片,而是一个array.一块是_ []func
块.在本例中,数组类型的长度为0,因此实际上是一个空类型.你不能在里面存放任何东西.此字段只有一个用途:
因为根据定义,函数类型的任何字段、变量或其他名称都是不可比较的,并且根据规范,任何包含无法比较的字段的 struct /类型在总体上都是不可比较的.因此,将_ [0]func()
加到任何类型上都会使执行此操作的代码产生编译时错误:
type Base struct {
Foo uint64
}
type SomeStruct struct {
_ [0]func()
Base // embedded
}
func main() {
a, b := Base{Foo: 123}, Base{Foo: 123}
fmt.Println(a == b) // works
safeA, safeB := SomeStruct{Base: a}, SomeStruct{Base: b}
fmt.Println(safeA == safeB) // compiler error
}
使用[0]func()
而不是func()
或[]func
的原因是,当 struct 体中的第一个字段的大小为零时(我们只能在编译时知道数组的大小,而不是切片),那么它们在内存中占用0字节.func()
类型不会被认为是零字节大小,所以回答你的最后一个问题:
是的,出于优化的原因,使用_ [0]func()
而不是_ func()
.