首頁 >後端開發 >Golang >可以在類型為'*T”的變數上呼叫接收器類型為'T”的 Go 方法嗎?

可以在類型為'*T”的變數上呼叫接收器類型為'T”的 Go 方法嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-17 18:27:02673瀏覽

Can Go Methods with Receiver Type `T` Be Called on Variables of Type `*T`?

指針類型的Go 方法:使用指針類型*T 的接收者T 調用方法*T

問題:

Go 規範規定,指標類型T的方法集包含其對應類型 T 的方法集。這是否意味著我們可以對類型 T 的變數呼叫接收者 T 的方法?

答案:

雖然規範建議這樣做,但需要注意的是,您不能直接在 T 上呼叫 *T 的方法。相反,編譯器會自動取消引用變數到 &T 並呼叫方法,有效執行 (&T).m()。

Go 規範中明確定義了此行為:

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

示範:

以下範例說明了此行為:

package main

import (
    "fmt"
    "reflect"
)

type User struct{}

func (this *User) SayWat() {
    fmt.Println(reflect.TypeOf(this))
    fmt.Println("WAT\n")
}

func main() {
    var user = User{}

    fmt.Println(reflect.TypeOf(user))

    user.SayWat()
}

儘管使用* 的接收器聲明了SayWat 方法User,我們可以在user 上呼叫它,它的型別是User。編譯器會自動處理解引用並呼叫 (&user).SayWat().

Exception:

但是,這只適用於可尋址變數。如果嘗試對不可尋址的值呼叫指標方法,將會遇到錯誤。例如:

func aUser() User {
    return User{}
}

...

aUser().SayWat() // Error: cannot call pointer method on aUser()

以上是可以在類型為'*T”的變數上呼叫接收器類型為'T”的 Go 方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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