猿问

Go方法语法的基本原理

好的,我不得不承认,我根本并没有真正使用Go,但是我确实观察到了一些让我感到惊讶的东西,因为这种语言追求的是最小化和Go一样好的东西。如果没有合理的依据,我会感到惊讶,所以这就是我想要的。

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

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

但是为什么要为我所说的“接收器”提供一个额外的参数列表呢?这样做不会是一个更简单,更优雅的设计吗?

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

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


沧海一幻觉
浏览 204回答 3
3回答

江户川乱折腾

方法从根本上来说是特殊的,并且不同于常规函数。方法必须与接收器类型位于同一包中。方法用于满足接口。接收器参数是唯一可能会重载的参数。当匿名结构字段具有方法时,将“继承”这些方法。根据您的建议,函数和方法之间的界限变得非常模糊,并且很难弄清楚如何解决上述问题。就是说,我认为设计一种具有多种方法和接口的语言真的很有趣。但是,该语言不会是Go。

繁星点点滴滴

您的问题正确指出任何方法都是函数。但是,Go语言需要能够明确地区分方法和函数。这样做的原因是方法具有功能所没有的功能。Foo程序员需要选择是函数还是方法。Go的极简主义意味着该语言仅定义了少量关键字。Go作者可以选择一个新关键字,例如method,以区分方法和函数:method Foo(receiver *T, arg1 int) {}&nbsp; &nbsp;// 'Foo' is a method, not a function环顾Go编程语言,我们可以看到这种哲学是重用已经存在的关键字,而不是在每种情况下都使用单独的关键字。该for关键字是这种方法的一个很好的例子:for {}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Infinite loopfor a>0 {a--}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // A while-do loopfor i := range channel {}&nbsp; // Receive values from a channelfor i:=0; i<N; i++ {}&nbsp; &nbsp; &nbsp; // C-style for loop基本思想是,对于解析器(和Go程序员)for彼此区分各种类型的循环,如果可以通过关键字后面的语法来区分选项,则无需引入新关键字。 ..,它们的顺序以及它们的存在/不存在。for; := range identifier的func关键字遵循相同的模式。它可以在多种情况下使用:函数定义:&nbsp;func f() {}函数类型:&nbsp;type F func(int) int方法定义:&nbsp;func (t T) SomeMethod() {}关闭:&nbsp;{ ...; go func(){c<-1}(); ...}从极简主义的角度来看,一个func关键字比拥有多个关键字既简单又优雅。仅适用于接收器的额外参数列表func&nbsp;(t&nbsp;*T)&nbsp;Foo(x&nbsp;int)&nbsp;{}使解析器能够区分方法和功能:func&nbsp;IDENTIFIER&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;is&nbsp;going&nbsp;to&nbsp;be&nbsp;a&nbsp; functionfunc&nbsp;(&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;is&nbsp;going&nbsp;to&nbsp;be&nbsp;a&nbsp;method因此,解析器(以及Go程序员)可以根据func关键字后面是标识符还是来进行区分(。

PIPIONE

提议的替换在语义上与当前状态不相同,即,它不仅是语法上的更改。它会[尝试]自动创建碰巧是函数的第一个参数的任何[本地包]类型的方法。考虑到基本方法集对Go的自动界面满意度规则的概念有何影响,这很可能会导致大麻烦。简而言之,我认为对Go语言的这种更改在改善与方法和接口相关的许多不错功能的同时,并没有改善任何效果。
随时随地看视频慕课网APP

相关分类

Go
我要回答