Go 与具有命名参数与未命名参数的函数的接口

Go 与具有命名参数与未命名参数的函数的接口,go,protocol-buffers,Go,Protocol Buffers,我正在学习Go中的protobuf和gRPC。生成pb.go文件时,使用 protoc--go\u out=plugins=grpc:chat chat.proto 对于文件chat.proto syntax = "proto3"; package chat; message Message { string body = 1; } service ChatService { rpc SayHello(Message) returns (Message) {}

我正在学习Go中的protobuf和gRPC。生成pb.go文件时,使用

protoc--go\u out=plugins=grpc:chat chat.proto
对于文件
chat.proto

syntax = "proto3";
package chat;

message Message {
  string body = 1;
}

service ChatService {
  rpc SayHello(Message) returns (Message) {}
}
生成的
chat.pb.go
具有以下两个接口:

类型ChatServiceClient接口{
SayHello(ctx context.context,in*Message,opts…grpc.CallOption)(*Message,error)
}
...
类型ChatServiceServer接口{
SayHello(context.context,*消息)(*消息,错误)
}

我对
ChatServiceClient
界面中命名参数的使用感到困惑。这些参数是否有任何用途:
ctx
中的
opts
。在这种情况下,我们什么时候应该命名与未命名参数?

参数名称是可选的,如果是接口,则可能纯粹出于文档目的而提供

其中,方法为:

如您所见,
ParameterDecl
中的
IdentifierList
位于方括号内,这意味着它是可选的

想想这样一个例子:

type FileMover interface {
    MoveFile(dst, src string) error
}
它“响亮而清晰”。如果我们省略参数名呢

type FileMover interface {
    MoveFile(string, string) error
}
第一个参数是否标识源或目标并不明显。通过提供
dst
src
命名文档,可以清楚地说明问题

当您实现一个接口并为一个方法提供实现时,如果您想引用参数,您必须命名它们,因为您是通过它们的名称引用它们的,但是如果您不想引用参数,即使这样,它们也可能被忽略

见相关问题:

type FileMover interface {
    MoveFile(dst, src string) error
}
type FileMover interface {
    MoveFile(string, string) error
}