首頁 >後端開發 >Golang >為什麼Go不支援基於參數類型的函數重載?

為什麼Go不支援基於參數類型的函數重載?

Linda Hamilton
Linda Hamilton原創
2024-12-01 07:13:18798瀏覽

Why Doesn't Go Support Function Overloading Based on Argument Types?

Go 中的方法重載:參數類型的限制

Go 中,具有相同名稱和參數數量(參數數量)的方法可以操作在不同的類型上。但是,如果您嘗試將此類方法的接收者移至參數,則會遇到編譯錯誤。

考慮以下程式碼:

type A struct {
  Name string
}

type B struct {
  Name string
}

func (a *A) Print() {
  fmt.Println(a.Name)
}

func (b *B) Print() {
  fmt.Println(b.Name)
}

func main() {

  a := &A{"A"}
  b := &B{"B"}

  a.Print()
  b.Print()
}

此程式碼成功列印「A」和「B」到控制台。但是,如果您如下修改方法簽名:

func Print(a *A) {
  fmt.Println(a.Name)
}

func Print(b *B) {
  fmt.Println(b.Name)
}

func main() {

  a := &A{"A"}
  b := &B{"B"}

  Print(a)
  Print(b)
}

您將遇到編譯錯誤:

./test.go:22: Print redeclared in this block
    previous declaration at ./test.go:18
./test.go:40: cannot use a (type *A) as type *B in function argument

限制原因

Go 不支援根據參數類型重載使用者定義的函數。這與其他一些語言形成對比,例如 C ,它們允許基於函數名稱和參數類型進行重載。

在 Go 中,具有相同名稱和數量的函數必須具有相同的簽名。如果要在一個參數上「重載」函數,則必須使用該方法。例如,您可以為每個結構建立一個 Print 方法:

func (a A) Print() {
  fmt.Println(a.Name)
}

func (b B) Print() {
  fmt.Println(b.Name)
}

此方法允許您使用相同的方法名稱,同時保留程式碼的類型安全性。

以上是為什麼Go不支援基於參數類型的函數重載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn