Go 中的接口字面量

Interface literals in Go

首先澄清一下标题,我知道 Go 中没有接口文字这样的东西,但我想不出这个问题的另一个名字。

我在阅读一些 Go 代码时发现了一个奇怪的结构,如下所示:

clientOptions := []grpc.DialOption{grpc.WithInsecure()}
cc, err := grpc.Dial(l.Addr().String(), clientOptions...)

这里grpc.DialOptions是接口类型,grpc.WithInsecure()returns是那个类型。这里引起我注意的是 clientOptions 是一个切片,这对我来说似乎是多余的。所以我试着像这样移除大括号:

clientOptions := grpc.DialOption{grpc.WithInsecure()}

但我收到编译错误:“无效的复合文字类型 grpc.DialOption”

我试着在 go playground 上模拟这个,我得到了相同的结果。 此代码运行良好: https://go.dev/play/p/QJQR9BDGN4a

但此版本失败并出现相同的“无效复合文字类型错误”: https://go.dev/play/p/A0FasDybUg5

有人可以解释一下吗? 谢谢

你是正确的,这创建了一个切片:

clientOptions := []grpc.DialOption{grpc.WithInsecure()}

但我认为您误解了语法的作用。这将是一个空的切片文字:

clientOptions := []grpc.DialOption{}

这将是单个值,不在切片中:

clientOptions := grpc.WithInsecure()

作为参考,此语法包含在 Tour of Go