vtm11 Asked: 2024-02-05 20:03:53 +0800 CST2024-02-05 20:03:53 +0800 CST 2024-02-05 20:03:53 +0800 CST [0]func() 作为“不比较”哨兵 - 类型[重复] 772 结构定义中的“不比较”标记是什么类型? type SomeStruct struct { _ [0]func() // do not compare ... } 到底是什么[0]func()?对象的零长度切片func()?还有别的事吗? go 1 个回答 Voted Best Answer Elias Van Ootegem 2024-02-05T20:19:08+08:002024-02-05T20:19:08+08:00 好吧,考虑到我的评论也可以被视为一个答案: _ [0]func() 被读取为类型的未命名字段[0]func()。它不是一个切片,而是一个数组。一片就是_ []func。在本例中,数组类型的长度为 0,因此实际上是空类型。你不能在那里存储任何东西。该字段仅用于一个目的: 因为函数类型的任何字段、变量或其他名称根据定义都是不可比较的,并且根据规范,任何包含无法比较的字段的结构/类型都变得不可比较。因此,添加_ [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()or的原因[]func是,当结构中的第一个字段的大小为零时(我们只能在数组的编译时知道,而不是切片),那么它们在内存中占用 0 个字节。类型func()的大小不会被视为零字节,因此回答您的最后一个问题: 是的,出于优化原因_ [0]func()而使用而不是_ func()。
好吧,考虑到我的评论也可以被视为一个答案:
被读取为类型的未命名字段
[0]func()
。它不是一个切片,而是一个数组。一片就是_ []func
。在本例中,数组类型的长度为 0,因此实际上是空类型。你不能在那里存储任何东西。该字段仅用于一个目的:因为函数类型的任何字段、变量或其他名称根据定义都是不可比较的,并且根据规范,任何包含无法比较的字段的结构/类型都变得不可比较。因此,添加
_ [0]func()
到任何类型都会导致执行此操作的代码抛出编译时错误:演示在这里
[0]func()
使用而不是func()
or的原因[]func
是,当结构中的第一个字段的大小为零时(我们只能在数组的编译时知道,而不是切片),那么它们在内存中占用 0 个字节。类型func()
的大小不会被视为零字节,因此回答您的最后一个问题:是的,出于优化原因
_ [0]func()
而使用而不是_ func()
。