Go## 中方法與函數的區別,希望幫助對需要的朋友有所不同!
這篇文章將介紹Go中函數和方法之間的主要區別,以及如何最佳使用。語法
聲明語法
透過指定參數的類型、傳回值和函數主體來宣告函數:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">type Person struct {
Name string
Age int
}
// 这个函数返回一个新的对象`Person`
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}</pre><div class="contentsignin">登入後複製</div></div>
另一方面,透過額外指定「接收者」(在OOP術語中將是該方法所屬的「類別class」)來宣告方法:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// `Person`指针类型接收者的`isAdult方法
func (p *Person) isAdult() bool {
return p.Age > 18
}</pre><div class="contentsignin">登入後複製</div></div>
在上面的方法宣告中,我們在
方法。
函數呼叫使用獨立的參數,方法呼叫使用接收者類型。 p := NewPerson("John", 21)
fmt.Println(p.isAdult())
// true
函數與方法
在
理論上可以互換。例如,我們可以將
方法轉換為函數,並將
NewPerson函數作為方法:
type PersonFactory struct {} // NewPerson现在是PersonFactory结构的方法 func (p *PersonFactory) NewPerson(name string, age int) *Person { return &Person{ Name: name, Age: age, } } // 现在,isAdult是一个函数,在该函数中,我们将`Person`作为参数而不是接收者进行传递 func isAdult(p *Person) bool { return p.Age > 18 }
factory := &PersonFactory{} p := factory.NewPerson("John", 21) fmt.Println(isAdult(p)) // true
上面的程式碼看起來比需要的要複雜得多。這向我們表明,方法和函數的差異主要是語法上的差異,應該根據場景使用適當的抽象。
讓我們來看看Go應用程式中遇到的一些常見用例,以及適用於每個應用程式的適當抽象(函數或方法):#方法鏈
方法的一個非常有用的功能是能夠將它們連結在一起,同時仍保持程式碼的清潔。讓我們以設定
Persontype Person struct { Name string Age int } func (p *Person) withName(name string) *Person { p.Name = name return p } func (p *Person) withAge(age int) *Person { p.Age = age return p } func main() { p := &Person{} p = p.withName("John").withAge(21) fmt.Println(*p) // {John 21} }
如果我們將函數用於同一件事,那將看起來非常可怕:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">p = withName(withAge(p, 18), "John")</pre><div class="contentsignin">登入後複製</div></div>
有狀態與無狀態執行
在 可互換性 範例中,我們看到了使用PersonFactory
物件來建立Person的新實例。事實證明,這是一種反模式,應避免使用。
最好使用這裡的「無狀態」是指任何總是為同一輸入傳回相同輸出的程式碼NewPerson
先前宣告的函數之類的函數進行無狀態執行。
推論是,如果您發現函數讀取並修改了許多特定類型的值,則它可能應該定義成該類型的方法。
語意語意是指程式碼的閱讀方式。如果你用口語大聲朗讀程式碼,那麼哪個更有意義?
我們來看看isAdult
的函數和方法實作<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">customer := NewPerson("John", 21)
// Method
customer.isAdult()
// Function
isAdult(customer)</pre><div class="contentsignin">登入後複製</div></div>
在這裡 customer.isAdult() 對於詢問「顧客是否是成年人?」的理解比
結論
儘管我們討論了 Go 中函數和方法的一些關鍵區別和用例,但總會有例外!重要的是,不要將任何這些規則都作為基本原則。 最後,函數和方法之間的差異在於結果程式碼的讀取方式。如果您或您的團隊認為一種方法讀起來比另一種方法更好,那麼這就是正確的抽象!原文網址:https://www.sohamkamani.com/golang/functions-vs-methods/######翻譯網址:https://learnku.com/go/t /52424######
以上是詳解Go 中方法與函數的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!