Go 中的接口字面量

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

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

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

这里 grpc.DialOptions 是一个接口类型,而 grpc.WithInsecure() 返回该类型。在这里引起我注意的是 clientOptions 是一个切片,这对我来说似乎是多余的。所以我尝试像这样删除大括号:

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

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

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

但是这个版本失败了,同样的“无效的复合文字类型错误”: https ://go.dev/play/p/A0FasDybUg5

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


MMMHUHU
浏览 123回答 1
1回答

大话西游666

您是正确的,这会创建一个切片:clientOptions := []grpc.DialOption{grpc.WithInsecure()}但是我认为您误解了哪种语法可以做什么。这将是一个空切片文字:clientOptions := []grpc.DialOption{}这将是单个值,而不是切片:clientOptions := grpc.WithInsecure()作为参考,此语法包含在Tour of Go中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go