为了账号安全,请及时绑定邮箱和手机立即绑定

Go方法语法的基本原理

Go方法语法的基本原理

Go
沧海一幻觉 2021-04-28 18:05:07
好的,我不得不承认,我根本并没有真正使用Go,但是我确实观察到了一些让我感到惊讶的东西,因为这种语言追求的是最小化和Go一样好的东西。如果没有合理的依据,我会感到惊讶,所以这就是我想要的。因此,当您有一个方法时,您可以这样定义它:func (s *SomeStruct) Foo(x int) { }但是为什么要为我所说的“接收器”提供一个额外的参数列表呢?这样做不会是一个更简单,更优雅的设计吗?func Foo(s *SomeStruct, x int) { }然后s.Foo(5)刚刚转换为对函数的调用Foo(s, 5)?
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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

  • 方法必须与接收器类型位于同一包中。

  • 方法用于满足接口。

  • 接收器参数是唯一可能会重载的参数。

  • 当匿名结构字段具有方法时,将“继承”这些方法。

根据您的建议,函数和方法之间的界限变得非常模糊,并且很难弄清楚如何解决上述问题。

就是说,我认为设计一种具有多种方法和接口的语言真的很有趣。但是,该语言不会是Go。


查看完整回答
反对 回复 2021-05-10
?
繁星点点滴滴

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关键字后面是标识符还是来进行区分(


查看完整回答
反对 回复 2021-05-10
?
PIPIONE

TA贡献1829条经验 获得超9个赞

提议的替换在语义上与当前状态不相同,即,它不仅是语法上的更改。它会[尝试]自动创建碰巧是函数的第一个参数的任何[本地包]类型的方法。考虑到基本方法集对Go的自动界面满意度规则的概念有何影响,这很可能会导致大麻烦。

简而言之,我认为对Go语言的这种更改在改善与方法和接口相关的许多不错功能的同时,并没有改善任何效果。


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信