为什么go语言的方法有一个奇怪的语法

时间:2014-07-20 05:08:55

标签: oop go

我无法理解为什么go开发人员为方法确定了类似func (t Type) MethodName()的语法。我无法消化这个事实,特别是在reading this之后并且考虑到go是极简主义的事实。对于使用func Type.MethodName()func Type::MethodName()这样的隐式参数访问的对象,thisself这样的简单语法就不够了。或者我错过了当前语法提供的任何优势?

1 个答案:

答案 0 :(得分:8)

该特定语法的目标非常特定于Go语言,并且不能轻易映射到其他语言语法:

此语法允许您定义 method set

  

类型可能具有与之关联的方法集。 interface type的方法集是其接口。

     
      
  • 任何其他类型T的方法集包含所有methods声明的接收器类型T
  •   
  • 相应指针类型*T的方法集是使用receiver *TT声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。
  •   
     

其他规则适用于包含匿名字段的结构,如结构类型一节中所述。任何其他类型都有一个空方法集。在方法集中,每个方法必须具有唯一的非空方法名称。

     

类型的方法集使用该类型的接收器确定类型implements和可以called的方法的接口。

它不是一个“优势”,而是一个Go功能,允许使用新方法轻松扩展类型。

例如,请参阅“What are some examples of Go interfaces?”。


twotwotwo添加in the comments

  

显式接收器声明允许您执行两项特殊操作:

     
      
  1. 决定某些方法会获得指针接收器,而其他方法(例如,小结构上的非变异方法)则不会,
  2.   
  3. 选择特定于上下文的名称,而不是“T”或“self”(例如,您可能有this)。
      特定于上下文的名称为considered good style in Go
  4.   

请参阅Wiki CodeReviewComments

  

方法接收者的名字应该反映其身份;通常,其类型的一个或两个字母缩写就足够了(例如“func (srv *Server)...”或“c”代表“cl”。

     

不要使用通用名称,例如“Client”,“me”或“this”,面向对象语言的典型标识符更强调方法而不是功能。
  名称不必像方法论证那样具有描述性,因为它的作用是显而易见的,不起任何文件目的。它可以很短,因为它几乎出现在每种类型的每个方法的每一行上;熟悉承认简洁   也要保持一致:如果您在一种方法中呼叫接收者“self”,请不要在另一种方法中将其称为“c”。