亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號