Home > Back-end >  Interface literals in Go
Interface literals in Go

Time:02-19

First to clarify the title, I know there is no such thing as interface literals in Go but I couldn't come up with another name for this issue.

I was reading some Go code and found a weird construct, like so:

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

Here grpc.DialOptions is an interface type and grpc.WithInsecure() returns that type. What caught my eye here is that clientOptions is a slice, which seemed redundant to me. So I tried to remove the braces like so:

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

But I get compilation error: "invalid composite literal type grpc.DialOption"

I tried to simulate this on the go playground and I get the same result. This code runs fine: https://go.dev/play/p/QJQR9BDGN4a

But this version fails with the same "invalid composite literal type error": https://go.dev/play/p/A0FasDybUg5

Can someone explain this? Thanks

CodePudding user response:

You are correct that this creates a slice:

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

But I think you've misunderstood which syntax does what. This would be an empty slice literal:

clientOptions := []grpc.DialOption{}

This would be a single value, not in a slice:

clientOptions := grpc.WithInsecure()

For reference, this syntax is covered in the Tour of Go.

  • Related