v是指针的对象Vertex,并且Scale是指针的方法Vertex.那么为什么v.Scale(10)没有错,因为它v不是指向Vertex对象的指针?谢谢.
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Abs())
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的结构,只有一个方法:
type Person struct {
name string
}
func (p Person) SetName(name string) {
p.name = name
}
Run Code Online (Sandbox Code Playgroud)
以下输出:
dave := Person{}
dave.SetName("Dave")
fmt.Println(dave.name)
Run Code Online (Sandbox Code Playgroud)
将是空的,因为方法接收器接受一个值(或更准确地创建您传递的值的副本),因此它不会修改您的基础值.
如果我将方法更改为:
func (p *Person) SetName(name string) {
p.name = name
}
Run Code Online (Sandbox Code Playgroud)
输出将是"戴夫".
现在我不明白的是我不应该在指针上调用方法吗?所以在初始化我的对象时我应该这样做:
dave := &Person{}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
dave := Person{}
Run Code Online (Sandbox Code Playgroud)
另外使用go的反射包我试图找出以下值:
&Person
Run Code Online (Sandbox Code Playgroud)
并发现它是*人,这很好.当我打印值虽然我没有得到内存位置相比,当我打印指向int的指针的值时:
a := 4
fmt.Println(&a)
Run Code Online (Sandbox Code Playgroud)
我一直在阅读文档,提出问题,但是我学的越多,我就越想知道我是否遗漏了一些简单的东西,因为很多人并不认为这一切都让人困惑.