3 回答
TA贡献1851条经验 获得超5个赞
方法从根本上来说是特殊的,并且不同于常规函数。
方法必须与接收器类型位于同一包中。
方法用于满足接口。
接收器参数是唯一可能会重载的参数。
当匿名结构字段具有方法时,将“继承”这些方法。
根据您的建议,函数和方法之间的界限变得非常模糊,并且很难弄清楚如何解决上述问题。
就是说,我认为设计一种具有多种方法和接口的语言真的很有趣。但是,该语言不会是Go。
TA贡献1803条经验 获得超3个赞
您的问题正确指出任何方法都是函数。但是,Go语言需要能够明确地区分方法和函数。这样做的原因是方法具有功能所没有的功能。Foo程序员需要选择是函数还是方法。
Go的极简主义意味着该语言仅定义了少量关键字。Go作者可以选择一个新关键字,例如method,以区分方法和函数:
method Foo(receiver *T, arg1 int) {} // 'Foo' is a method, not a function
环顾Go编程语言,我们可以看到这种哲学是重用已经存在的关键字,而不是在每种情况下都使用单独的关键字。该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
基本思想是,对于解析器(和Go程序员)for彼此区分各种类型的循环,如果可以通过关键字后面的语法来区分选项,则无需引入新关键字。 ..,它们的顺序以及它们的存在/不存在。for; := range identifier
的func
关键字遵循相同的模式。它可以在多种情况下使用:
函数定义:
func f() {}
函数类型:
type F func(int) int
方法定义:
func (t T) SomeMethod() {}
关闭:
{ ...; go func(){c<-1}(); ...}
从极简主义的角度来看,一个func
关键字比拥有多个关键字既简单又优雅。
仅适用于接收器的额外参数列表
func (t *T) Foo(x int) {}
使解析器能够区分方法和功能:
func IDENTIFIER ... This is going to be a functionfunc ( ... This is going to be a method
因此,解析器(以及Go程序员)可以根据func
关键字后面是标识符还是来进行区分(
。
TA贡献1829条经验 获得超9个赞
提议的替换在语义上与当前状态不相同,即,它不仅是语法上的更改。它会[尝试]自动创建碰巧是函数的第一个参数的任何[本地包]类型的方法。考虑到基本方法集对Go的自动界面满意度规则的概念有何影响,这很可能会导致大麻烦。
简而言之,我认为对Go语言的这种更改在改善与方法和接口相关的许多不错功能的同时,并没有改善任何效果。
- 3 回答
- 0 关注
- 203 浏览
添加回答
举报