Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 为什么go语言对方法有奇怪的语法_Oop_Go - Fatal编程技术网

Oop 为什么go语言对方法有奇怪的语法

Oop 为什么go语言对方法有奇怪的语法,oop,go,Oop,Go,我不能很好地理解为什么go开发人员决定使用类似func(t-Type)MethodName()的语法作为方法。我无法消化这个事实,尤其是在考虑到围棋是极简主义的事实之后。像func Type.MethodName()或func Type::MethodName()这样的简单语法对于使用this或self这样的隐式参数访问对象是否足够。或者,我是否错过了当前语法提供的任何优势?该特定语法的目标对于Go语言来说非常特殊,无法轻松映射到其他语言语法: 此语法允许您定义 类型可能有与其关联的方法集。方法

我不能很好地理解为什么go开发人员决定使用类似
func(t-Type)MethodName()
的语法作为方法。我无法消化这个事实,尤其是在考虑到围棋是极简主义的事实之后。像
func Type.MethodName()
func Type::MethodName()
这样的简单语法对于使用
this
self
这样的隐式参数访问对象是否足够。或者,我是否错过了当前语法提供的任何优势?

该特定语法的目标对于Go语言来说非常特殊,无法轻松映射到其他语言语法:

此语法允许您定义

类型可能有与其关联的方法集。方法集是它的接口

  • 任何其他类型
    T
    的方法集由所有使用接收方类型
    T
    声明的方法组成
  • 相应指针类型
    *T
    的方法集是使用receiver
    *T
    T
    声明的所有方法集(也就是说,它还包含
    T
    的方法集)
进一步的规则适用于包含匿名字段的结构,如结构类型一节所述。任何其他类型的方法集都为空。在方法集中,每个方法必须具有唯一的非空方法名称

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

与其说它是一个“优势”,不如说它是一个Go特性,允许使用新方法轻松地扩展类型

例如见“”


加上:


显式接收方声明允许您做两件特殊的事情:

  • 确定某些方法将获得指针接收器,而其他方法(例如,小型结构上的非变异方法)不会,并且
  • 选择特定于上下文的名称,而不是“
    self
    ”或“
    this
    ”(例如,您可能有一个
    func(srv*服务器)…
    )。
    上下文特定的名称是

  • 方法接收方的名称应反映其身份;通常,其类型的一个或两个字母缩写就足够了(例如“
    c
    ”或“
    cl
    ”表示“
    客户机
    ”)

    不要使用泛型名称,如“
    me
    ”、“
    this
    ”或“
    self
    ”,这些标识符是面向对象语言的典型标识符,它们更强调方法而不是函数。
    该名称不必像方法参数那样具有描述性,因为它的作用是显而易见的,并且不用于记录目的。它可以很短,因为它几乎会出现在每一种类型的方法的每一行上;熟悉意味着简洁。
    也要保持一致:如果在一种方法中调用接收者“
    c
    ”,在另一种方法中不要调用它“
    cl


    该特定语法的目标对于Go语言来说非常特殊,无法轻松映射到其他语言语法:

    此语法允许您定义

    类型可能有与其关联的方法集。方法集是它的接口

    • 任何其他类型
      T
      的方法集由所有使用接收方类型
      T
      声明的方法组成
    • 相应指针类型
      *T
      的方法集是使用receiver
      *T
      T
      声明的所有方法集(也就是说,它还包含
      T
      的方法集)
    进一步的规则适用于包含匿名字段的结构,如结构类型一节所述。任何其他类型的方法集都为空。在方法集中,每个方法必须具有唯一的非空方法名称

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

    与其说它是一个“优势”,不如说它是一个Go特性,允许使用新方法轻松地扩展类型

    例如见“”


    加上:


    显式接收方声明允许您做两件特殊的事情:

  • 确定某些方法将获得指针接收器,而其他方法(例如,小型结构上的非变异方法)不会,并且
  • 选择特定于上下文的名称,而不是“
    self
    ”或“
    this
    ”(例如,您可能有一个
    func(srv*服务器)…
    )。
    上下文特定的名称是

  • 方法接收方的名称应反映其身份;通常,其类型的一个或两个字母缩写就足够了(例如“
    c
    ”或“
    cl
    ”表示“
    客户机
    ”)

    不要使用泛型名称,如“
    me
    ”、“
    this
    ”或“
    self
    ”,这些标识符是面向对象语言的典型标识符,它们更强调方法而不是函数。
    该名称不必像方法参数那样具有描述性,因为它的作用是显而易见的,并且不用于记录目的。它可以很短,因为它几乎会出现在每一种类型的方法的每一行上;熟悉意味着简洁。
    也要保持一致:如果在一种方法中调用接收者“
    c
    ”,在另一种方法中不要调用它“
    cl


    显式接收器声明允许您做两件特殊的事情:1)确定某些方法将获得指针接收器,而其他方法(通常是内存占用小的类型上的非变异方法)不获得指针接收器;2)选择上下文特定的名称,而不是“self”或“this”(例如,您可能有一个
    func(srv*Server)
    ); 上下文特定的名称在Go中被认为是很好的样式(请参阅)。@two good points。我有