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

vij*_*raj 1 oop go

我不明白为什么go开发人员选择了类似于func (t Type) MethodName()方法的语法.我无法消化这一事实,特别是在阅读本文并考虑到go是极简主义的事实之后.岂不更简单的语法像func Type.MethodName()func Type::MethodName()已经足够与物体使用隐含参数像访问thisself.或者我错过了当前语法提供的任何优势?

Von*_*onC 8

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

此语法允许您定义方法集

类型可以具有与其关联的方法集.接口类型的方法集是其接口.

  • 任何其他类型的方法集T包含用接收器类型声明所有方法T.
  • 设置相应的指针型的方法*T是该组的与接收器声明的所有方法*TT(即,它也包含的方法集T).

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

类型的方法集确定类型实现的接口以及可以使用该类型的接收器调用的方法.

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

请参阅" Go接口的一些示例? ".


twotwotwo 在评论中添加:

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

  1. 决定一些方法将获得指针接收器和其他方法(例如,小结构上的非变异方法)不会,和
  2. 选择特定于上下文的名称而不是self"或this"(例如,您可能有func (srv *Server)...).
    特定上下文的名称在Go中认为是好的样式

请参阅Wiki CodeReviewComments

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

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

  • 显式接收器声明允许您做两件特别的事情:1)确定某些方法将获得指针接收器而其他方法(通常在具有小内存占用的类型上的非变异方法)不会,以及2)选择上下文 - 具体名称而不是'self'或'this'(例如,你可能有一个`func(srv*Server)...`); 特定于上下文的名称在Go中被视为好的风格(请参阅https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Names). (2认同)