使用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}