快轉到主要內容
  1. Go 基礎入門/

方法

目錄
Go基礎入門 - 系列文
12: ➫

12: 本節課介紹 Go 方法的概念、宣告和使用方式。

方法的基本概念
#

  • 定義: 方法是綁定到特定類型的函式。
  • 規則: 方法必須與其所屬的類型定義在同一個套件中。

方法的宣告與使用
#

  • 方法宣告: 在函式名前加上一個接收者參數,指明該方法綁定的類型。
  • 調用方法: 使用類型實例加上點操作符來調用方法。
  • 可見性: 方法名首字母小寫為套件內私有(Private),大寫為"匯出的"(Exported),即公開、對外可見。
  • 自定義類型:
    type Employee struct {
        Name string
        ID   uint32
    }
    
  • 方法宣告:
    func (e Employee) PrintName() {
        fmt.Println(e.Name)
    }
    

值接收子
#

值接收子(Value Receiver)

  • 特點: 方法接收值的副本,因此對該值的任何修改都不會影響原始實例。

  • 使用時機: 當您不需要修改原始實例時,或者當您需要保護原始數據不被意外修改時。

  • 實際應用場景: 假設我們有一個 Account 結構體,我們想要獲取賬戶的描述信息,但不修改任何資料。

    type Account struct {
        HolderName string
        Balance    float64
    }
    
    func (a Account) Description() string {
        return fmt.Sprintf("Account Holder: %s, Balance: %.2f", a.HolderName, a.Balance)
    }
    

指標接收子
#

指標接收子(Pointer Receiver)

  • 特點: 方法接收指向值的指標,允許直接修改原始實例。

  • 使用時機: 當您需要修改原始數據,或者結構體過大而希望避免副本的開銷時。

  • 實際應用場景: 繼續使用前面的 Account 結構體,我們可能需要一個方法來更新賬戶的餘額。

    func (a *Account) UpdateBalance(newBalance float64) {
        a.Balance = newBalance
    }
    

在這兩個例子中,Description 方法使用值接收子,它只讀取數據而不進行修改。而 UpdateBalance 方法使用指標接收子,允許它修改 Account 結構體的 Balance 字段。這種方法的選擇取決於您是否需要修改原始數據,以及是否關注性能(例如避免大型結構體的副本開銷)。

函式vs方法
#

何時該宣告函式?何時該使用方法?

  • 使用函式: 當操作不依賴於某個特定的類型時。
  • 使用方法: 當操作與某個特定的類型緊密相關時。
Go基礎入門 - 系列文
12: ➫

相關文章

介面
13: 本節課介紹Go介面的基本概念、應用場景、宣告和實現方式。
Goroutine
14: 本節課介紹Goroutine是 Go 實現高效並發的輕量級執行緒。
Channel
15: 本節課說明channel,是 Go 並行處理的核心元素。