使用指標接收器時,值物件自動取指標的奇怪問題

Goten1934發表於2017-10-11

常見的 Go 教材裡都提到,如果在方法中使用指標接受器,仍然可以在值物件上呼叫該方法,前提是該值可以取指標。

但是,如果我們不將值儲存到變數中,而是直接 “串聯” 函式呼叫,則無法自動取地址。

例如:

package main

import (
    "fmt"
    "reflect"
)

type Circle struct {
    radius float64
}

func NewCircle(radius float64) Circle { 
    return Circle{radius: 0}
}

func (c *Circle) DummyMethod() { 
    fmt.Println("Type of receiver:", reflect.TypeOf(c))
}

func main() {
    //m := NewCircle(1)
    NewCircle(1).DummyMethod()  // Chaining function calls results in error.
}

在這裡,建構函式 NewCircle() 返回值型別,我們不將其儲存到變數中,直接 “串聯” 函式呼叫。執行以上程式碼,輸出 ./test.go:24: cannot call pointer method on NewCircle(1) ./test.go:24: cannot take the address of NewCircle(1)

但是,如果將 NewCircle() 返回的值先儲存到變數裡,再呼叫 (c *Circle) DummyMethod(),卻可以正常自動取地址:

func main() {
    m := NewCircle(1)
    m.DummyMethod()
}

輸出:Type of receiver: *main.Circle

這裡似乎觸及了語法糖的內部實現問題?但沒有在書籍和文件中找到說明。有沒有大佬能解釋一下

更多原創文章乾貨分享,請關注公眾號
  • 使用指標接收器時,值物件自動取指標的奇怪問題
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章