首頁  >  文章  >  後端開發  >  ## Go中為什麼值可以呼叫指標方法?

## Go中為什麼值可以呼叫指標方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-25 23:58:28424瀏覽

## Why Can a Value Invoke a Pointer Method in Go?

Go 接收器方法呼叫語法:深入探究

在《Effective Go》指南中,指出指標方法只能是在指標上調用,而值方法可以在指針或值上調用。然而,最近的一次遇到提出了一個問題:為什麼下面程式碼中的值會呼叫指標方法?

<code class="go">package main

import (
  "fmt"
)

type age int

func (a age) String() string {
  return fmt.Sprintf("%d yeasr(s) old", int(a))
}

func (a *age) Set(newAge int) {
  if newAge >= 0 {
    *a = age(newAge)
  }
}

func main() {
  var vAge age = 5
  pAge := new(age)
  vAge.Set(10) // Compilation successful
}</code>

為了解決這個問題,我們轉向 Go 語言規範。在「呼叫」下,它表示:

如果 x(的類型)的方法集包含 m 並且參數列表可以分配給 m 的參數列表,則方法呼叫 x.m() 是有效的。如果 x 是可尋址的且 &x 的方法集包含 m,則 x.m() 是 (&x).m() 的簡寫。

在我們的例子中,vAge 是可尋址的(到 *age 的型別轉換是有效的),所以vAge.Set(10) 本質上是 (&vAge).Set(10)。由於Set()的接收者類型是指針,這就是為什麼值vAge可以呼叫指標方法Set()。

以上是## Go中為什麼值可以呼叫指標方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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