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 關注
- 242 瀏覽
添加回答
舉報