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().

Go相关问答推荐

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

Go在使用HTTP代理时如何处理DNS请求?

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

如何将GoFr筛选器用于查询参数?

Wamtime Memory中的‘Offset’是什么?Read?

从带有嵌套括号的字符串中提取值

Go 中如何判断 struct 体是否包含另一个 struct 体?

Golang chromedp Dockerfile

Golang和Gin web框架在router.Run()之后执行代码

这是泛型的有效用例吗?

一个Go module可以和之前的非module模块发布在同一个路径下吗?

如何从 Asterisk Manager Interface Event 获取活动呼叫数

设置指向空接口的指针

emersion/go-imap - imap.FetchRFC822:无效内存地址或零指针取消引用

从 os.stdout 读取

为什么 Go 被认为是部分抢占式的?

Golang:隐式 struct 匹配

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

golang jwt.MapClaims 获取用户ID

Golang 泛型同时具有接口和实现