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。
首先澄清一下标题,我知道 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。