使用Point{1, 2}.ScaleBy(2)
您嘗試調用指針接收方法ScaleBy
與價值:Point{1, 2}
:
任何其他類型T的方法集由所有聲明爲 的方法組成,其中接收方t YPE T.
但如果使用可尋址的類型:
對應的指針類型* T的方法集合是與接收機* T或T(即聲明的所有 方法,它還包含了T)的方法集合 。
則是可能的:這意味着你或者編譯器應該得到暫時值的地址(以複合文字的地址):
地址符:
對於類型的操作數X T,地址操作& x生成一個 類型* T到x的指針。操作數必須是可尋址的,即即 要麼是變量,指針間接或片段索引操作; 或可尋址結構操作數的字段選擇器;或者可尋址陣列的索引操作的數組 。作爲 尋址能力要求的一個例外,x也可以是(可能爲括號的)複合字面量。如果x的評估會導致運行時間 恐慌,那麼評估& x也會。
裁判:https://golang.org/ref/spec#Address_operators
你可以叫(&Point{1, 2}).ScaleBy(2)
這樣的工作示例代碼(指針接收器):
package main
import "fmt"
func main() {
p := (&Point{1, 2}).ScaleBy(2)
fmt.Println(p) // &{2 4}
}
type Point struct {
X, Y int
}
func (p *Point) ScaleBy(factor float64) *Point {
p.X *= 2
p.Y *= 2
return p
}
你可以叫Point{1, 2}.ScaleBy(2)
這樣的工作示例代碼(值接收器):
package main
import "fmt"
func main() {
p := Point{1, 2}.ScaleBy(2)
fmt.Println(p) // &{2 4}
}
type Point struct {
X, Y int
}
func (p Point) ScaleBy(factor float64) *Point {
p.X *= 2
p.Y *= 2
return &p
}
輸出:
&{2 4}
還看到該工作示例代碼(指針接收器):
package main
import "fmt"
func main() {
p := Point{1, 2}
p.ScaleBy(2)
fmt.Println(p) // {2 4}
}
type Point struct {
X, Y int
}
func (p *Point) ScaleBy(factor float64) {
p.X *= 2
p.Y *= 2
}
輸出:
{2 4}