我无法理解为什么go开发人员为方法确定了类似func (t Type) MethodName()
的语法。我无法消化这个事实,特别是在reading this之后并且考虑到go是极简主义的事实。对于使用func Type.MethodName()
或func Type::MethodName()
这样的隐式参数访问的对象,this
或self
这样的简单语法就不够了。或者我错过了当前语法提供的任何优势?
答案 0 :(得分:8)
该特定语法的目标非常特定于Go语言,并且不能轻易映射到其他语言语法:
此语法允许您定义 method set
类型可能具有与之关联的方法集。 interface type的方法集是其接口。
- 任何其他类型
T
的方法集包含所有methods声明的接收器类型T
。- 相应指针类型
*T
的方法集是使用receiver*T
或T
声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。其他规则适用于包含匿名字段的结构,如结构类型一节中所述。任何其他类型都有一个空方法集。在方法集中,每个方法必须具有唯一的非空方法名称。
类型的方法集使用该类型的接收器确定类型implements和可以called的方法的接口。
它不是一个“优势”,而是一个Go功能,允许使用新方法轻松扩展类型。
例如,请参阅“What are some examples of Go interfaces?”。
显式接收器声明允许您执行两项特殊操作:
- 决定某些方法会获得指针接收器,而其他方法(例如,小结构上的非变异方法)则不会,
- 选择特定于上下文的名称,而不是“
醇>T
”或“self
”(例如,您可能有this
)。
特定于上下文的名称为considered good style in Go
方法接收者的名字应该反映其身份;通常,其类型的一个或两个字母缩写就足够了(例如“
func (srv *Server)...
”或“c
”代表“cl
”。不要使用通用名称,例如“
Client
”,“me
”或“this
”,面向对象语言的典型标识符更强调方法而不是功能。
名称不必像方法论证那样具有描述性,因为它的作用是显而易见的,不起任何文件目的。它可以很短,因为它几乎出现在每种类型的每个方法的每一行上;熟悉承认简洁 也要保持一致:如果您在一种方法中呼叫接收者“self
”,请不要在另一种方法中将其称为“c
”。