91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go中方法與函數的區別是什么

發布時間:2020-12-14 12:08:12 來源:億速云 閱讀:286 作者:小新 欄目:編程語言

小編給大家分享一下Go中方法與函數的區別是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Go中廣泛使用了函數和方法來提供抽象,使我們的程序更易于閱讀和推理。從表面上來看,函數和方法看起來都相似的,但是存在一些重要的語義差異,這些差異可能會極大地影響代碼的可讀性。

語法

聲明語法

通過指定參數的類型、返回值和函數主體來聲明函數:

type Person struct {
  Name string
  Age int
}

// 這個函數返回一個新的對象`Person`
func NewPerson(name string, age int) *Person {
  return &Person{
    Name: name,
    Age: age,
  }
}

另一方面,通過額外指定“接收者”(在OOP術語中將是該方法所屬的“類 class”)來聲明方法:

// `Person`指針類型接收者的`isAdult方法
func (p *Person) isAdult() bool {
  return p.Age > 18
}

在上面的方法聲明中,我們在*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}
}

如果我們將函數用于同一件事,那將看起來非常可怕:

p = withName(withAge(p, 18), "John")

有狀態與無狀態執行

在 可互換性 示例中,我們看到了使用PersonFactory對象來創建Person的新實例。事實證明,這是一種反模式,應避免使用。

最好使用NewPerson以前聲明的函數之類的函數進行無狀態執行。

這里的“無狀態”是指始終為同一輸入返回相同輸出的任何代碼

推論是,如果您發現函數讀取并修改了許多特定類型的值,則它可能應該定義成該類型的方法。

語義

語義是指代碼的閱讀方式。如果你用口語大聲朗讀代碼,那么哪個更有意義?

我們來看看 isAdult 的函數和方法實現

customer := NewPerson("John", 21)

// Method
customer.isAdult()

// Function
isAdult(customer)

在這里 customer.isAdult() 對于詢問「客戶是否是成年人?」的理解要比isAdult(customer) 好得多。此外,當你問「x 是成年人嗎?」時,總是會在 x 的上下文中被問到。

以上是“Go中方法與函數的區別是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会东县| 额尔古纳市| 来安县| 延寿县| 寿宁县| 兰坪| 岑溪市| 泰来县| 蓬溪县| 开江县| 巴彦县| 巢湖市| 镇江市| 宜昌市| 威信县| 合阳县| 车致| 六安市| 黎川县| 峡江县| 长汀县| 新丰县| 安龙县| 曲靖市| 珠海市| 内乡县| 西丰县| 铁力市| 青铜峡市| 昭平县| 乐陵市| 遵义县| 芦溪县| 霍城县| 南木林县| 新丰县| 娱乐| 阳城县| 胶南市| 英德市| 噶尔县|