天天看點

徹底搞懂 Golang 中的方法(Methods)

作者:路多辛

Golang 支援一些類似面向對象程式設計的特性,方法就其中之一,本文将詳細介紹 Golang 中方法相關的知識。

方法(Methods)定義

在 Golang 中,方法(methods)是與特定類型相關聯的函數。類似面向對象語言中的成員函數,方法可以通路該類型的資料和其他方法。

方法定義由關鍵字 func 開始,後面跟上接收者、方法名、參數清單和傳回值清單。方法定義的基本文法如下:

func (r ReceiverType) methodName(parameterList) (returnParameterList) {
  // 方法體
}           

具體含義如下:

  • r:是接收者類型(receiver)的簡寫,一般使用接收者首字母的小寫格式(如果方法體中使用不到可以省略)。
  • ReceiverType: 表示接收者類型,可以是結構體、自定義函數類型等。
  • methodName: 表示方法名,根據慣例,方法名的首字母通常使用大寫字母。
  • parameterList: 表示方法的參數清單,類似于函數的參數清單。
  • returnParameterList: 表示方法的傳回值,可以有多個傳回值。
  • 方法體:包含實作方法功能的代碼塊。

以下是一個簡單的示例代碼:

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

// SayHello 在 Person 類型上定義一個方法 SayHello
func (p Person) SayHello() {
	fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}

func main() {
	// 建立一個 Person 類型的執行個體
	var person Person
	person.Name = "路多辛"
	person.Age = 18

	// 調用 SayHello 方法
	person.SayHello()
}           

首先定義了 Person 結構體,并為其定義了 SayHello 方法。然後在 main 函數中首先建立了一個 Person 類型的執行個體,然後調用了它的 SayHello 方法。

接收者類型

方法的接收者可以是值接收者(value receiver),也可以是指針接收者(pointer receiver)。

當使用值接收者調用方法時,Golang 會通過值傳遞的方式将接收者傳遞給方法,并對方法中的接收者進行拷貝,值接收者适用于對接收者的值進行操作的場景。

當使用指針接收者調用方法時,Golang 會通過指針傳遞的方式将接收者傳遞給方法,方法可以修改接收者的資料,這種方法适用于需要修改接收者狀态的場景。

來看一個簡單的示例:

package main  
  
import "fmt"  
  
type Rectangle struct {  
    width, height float64  
}  
  
// 使用值接收者調用方法,将傳回矩形的面積  
func (r Rectangle) Area() float64 {  
    return r.width * r.height  
}  
  
// 使用指針接收者調用方法,将修改矩形的寬度  
func (r *Rectangle) SetWidth(w float64) {  
    r.width = w  
}  
  
func main() {  
    // 建立一個 Rectangle 類型的執行個體  
    var rect Rectangle  
    rect.width = 10.0  
    rect.height = 5.0  
  
    // 使用值接收者調用 Area 方法,并列印結果  
    fmt.Println("Area:", rect.Area()) // 輸出:Area: 50.000000  
  
    // 使用指針接收者調用 SetWidth 方法,并列印結果  
    rect.SetWidth(15.0)  
    fmt.Println("Width:", rect.width) // 輸出:Width: 15.000000  
}           

方法的其他特性

方法有很多和函數類似的特性,如下:

  • 可以接受零個或多個輸入參數
  • 支援可變輸入參數,可變參數意味着方法可以接受不定數量參數
  • 可以傳回零個或多個參數
  • 不支援重載
  • 接收者類型相同的情況下,方法名不能重複
  • 不支援預設參數

小結

本文詳細講解了 Golang 中方法相關的知識,方法是 Golang 中實作類似面向對象程式設計特性的一種機制,通過使用方法,可以提高代碼的可重用性和可維護性。