首頁 > 後端開發 > Golang > 詳解Go 中方法與函數的區別

詳解Go 中方法與函數的區別

藏色散人
發布: 2020-12-11 15:32:04
轉載
2996 人瀏覽過

上下由golang教學欄位中給予大家詳解 Go

golang教學

欄位給大家詳解

Go## 中方法與函數的區別,希望幫助對需要的朋友有所不同! banner image

這篇文章將介紹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 &amp;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 &gt; 18 }</pre><div class="contentsignin">登入後複製</div></div>在上面的方法宣告中,我們在

*Person

類型上宣告了

isAdult

方法。

執行語法

函數呼叫使用獨立的參數,方法呼叫使用接收者類型。

p := NewPerson("John", 21)

fmt.Println(p.isAdult())
// true
登入後複製
互換性函數與方法  理論上可以互換。例如,我們可以將

isAdult

方法轉換為函數,並將

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應用程式中遇到的一些常見用例,以及適用於每個應用程式的適當抽象(函數或方法):#方法鏈

方法的一個非常有用的功能是能夠將它們連結在一起,同時仍保持程式碼的清潔。讓我們以設定

Person

使用連結的某些屬性為例:

type 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), &quot;John&quot;)</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(&quot;John&quot;, 21) // Method customer.isAdult() // Function isAdult(customer)</pre><div class="contentsignin">登入後複製</div></div>在這裡 customer.isAdult() 對於詢問「顧客是否是成年人?」的理解比

isAdult(customer)

好很多。此外,當你問「x 是成年人嗎?」時,總是會在

x 的上下文中被問到。

結論

儘管我們討論了 Go 中函數和方法的一些關鍵區別和用例,但總會有例外!重要的是,不要將任何這些規則都作為基本原則。

最後,函數和方法之間的差異在於結果程式碼的讀取方式。如果您或您的團隊認為一種方法讀起來比另一種方法更好,那麼這就是正確的抽象!

原文網址:https://www.sohamkamani.com/golang/functions-vs-methods/######翻譯網址:https://learnku.com/go/t /52424######

以上是詳解Go 中方法與函數的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板