Go 教學中提到指標用來實作值上的方法。但是,如果我們聲明一個帶有非指標接收器的方法,但嘗試在指標值上使用它,或者反之亦然,會發生什麼?
答案在於 Go 語言的兩個基本規則:
方法派生:
Go 允許從現有方法派生方法。在您的範例中,方法 func (v Vertex) Abs() float64 衍生自方法 func (v *Vertex) Abs() float64。這意味著當你聲明前一個方法時,會自動產生一個新的實現,它本質上是用指向接收者的指標來呼叫原始方法:
因此,無論你是否聲明func (v * Vertex) Abs() 或func (v Vertex) Abs(),這兩種情況都會呼叫產生的方法。
自動取位址:
Go 可以自動產生指標到一個變數。在下列情況下,表達式v.Abs() 解析為程式碼:
這表示當您將值傳遞給需要指標的方法時,Go 無法自動從指標衍生出該方法現有的,編譯器會產生一個指向該值的指針,然後呼叫該指針上的方法。
總而言之,Go 遵循以下規則來處理指標和方法:
以上是當接收者類型和值類型不符時,Go 如何處理方法和指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!