Go&x27的基本原理;s方法语法

Go&x27的基本原理;s方法语法,go,Go,好吧,我必须承认,我实际上根本不怎么使用围棋,但我确实观察到了一些让我感到奇怪的事情,对于一种追求简约的语言,以及围棋所做的一切好东西。如果没有一个合理的理由,我会感到惊讶,所以这就是我要寻找的 因此,当您有一个方法时,您可以这样定义它: func (s *SomeStruct) Foo(x int) { } 但是为什么要为“接收者”设置一个额外的参数列表,我想这就是所谓的“接收者”?这不是一个更简单、更优雅的设计吗 func Foo(s *SomeStruct, x int) { } 然后

好吧,我必须承认,我实际上根本不怎么使用围棋,但我确实观察到了一些让我感到奇怪的事情,对于一种追求简约的语言,以及围棋所做的一切好东西。如果没有一个合理的理由,我会感到惊讶,所以这就是我要寻找的

因此,当您有一个方法时,您可以这样定义它:

func (s *SomeStruct) Foo(x int) { }
但是为什么要为“接收者”设置一个额外的参数列表,我想这就是所谓的“接收者”?这不是一个更简单、更优雅的设计吗

func Foo(s *SomeStruct, x int) { }

然后将
s.Foo(5)
转换为对函数的调用
Foo(s,5)

可能是因为go不是Python

还有因为


不能在对象包之外声明方法。因此,我想方法和函数之间的语法差异的主要原因是能够区分它们。

建议的替换在语义上与当前状态不同,即,它不仅仅是语法上的变化。它将[尝试]自动创建碰巧是函数第一个参数的任何[本地包]类型的方法。考虑到基本方法集是如何编写ToGo的自动接口满足规则的概念的,这很可能会导致一个大混乱


简言之,我认为对Go语言的这种更改没有任何改进,同时破坏了它与方法和接口相关的许多优秀功能。

方法从根本上说是特殊的,不同于常规函数

  • 方法必须与接收器类型位于同一个包中
  • 方法用于满足接口
  • 接收器参数是唯一可能过载的参数
  • 当匿名结构域有方法时,这些方法是“继承的”
根据您的建议,函数和方法之间的界限变得非常模糊,很难找出如何解决上述问题


也就是说,我认为设计一种具有多种方法和接口的语言会非常有趣。但是,这种语言不会被使用。

您的问题正确地指出,任何方法都是函数。然而,Go语言需要能够明确区分方法和函数。这是因为方法具有函数所没有的特性。程序员需要选择
Foo
是函数还是方法

Go的极简主义意味着该语言只定义了一小部分关键字。Go的作者可以选择一个新的关键字,例如
方法
,以区分方法和函数:

method Foo(receiver *T, arg1 int) {}   // 'Foo' is a method, not a function
func IDENTIFIER ...     This is going to be a function
func ( ...              This is going to be a method
环顾围棋编程语言,我们可以看到它的理念是重用已有的关键字,而不是在每次使用时都有一个单独的关键字。
for
关键字就是这种方法的一个很好的例子:

for {}                     // Infinite loop
for a>0 {a--}              // A while-do loop
for i := range channel {}  // Receive values from a channel
for i:=0; i<N; i++ {}      // C-style for loop
使解析器能够区分方法和函数:

method Foo(receiver *T, arg1 int) {}   // 'Foo' is a method, not a function
func IDENTIFIER ...     This is going to be a function
func ( ...              This is going to be a method

因此,解析器(以及Go程序员)可以根据
func
关键字后面是标识符还是

看看magpie,它使用多种方法,由Dart Googler编写。谢谢!这正是我想要的答案!你建议的方向是Nim语言的发展方向: