对于指针,我其实挺难理解的。为什么非要用指针来进行操作呢?下面是我的学习笔记和心得。
取址符 & 可以取得当前变量的地址
取值符 * 访问地址指向的值
数据类型 *指向的类型
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(11)
fmt.Println(v.Abs())
}
这是一段范本,对于0基础的我,实在有一些看不懂。我只是觉得我理解了。
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
如果把这一段的星号去掉了,结果始终是5,而不去掉,结果是55.我一直在想为什么呢?直到我发现这个函数没有return,也就是说,指针函数,直接对地址的值进行了操作,把v.x 和 v.y的地址上的值改为3 x 11, 和 4 x 44。为了验证我的想法,我修改了下代码。
func main() {
v := Vertex{3, 4}
fmt.Println(*&v)
v.Scale(11)
fmt.Println(v)
fmt.Println(v.Abs())
}
运行代码之后可以看到v的值,已经修改为 33 和 44了。也就是说,通过直接操作内存,函数不return结果,也可以操作。而去掉星号之后,就变成,虽然操作了值,但是没有return。相比较而言,的确简单了很多。下面是我自己做的另外一个例子,正常的函数 addone,再调用之后,value的数值并不会改变,但是plusone,使用指针的方法,就发现了改变。
package main
import (
"fmt"
"gocoding/gocoding/note"
)
func addone(v int) {
v++
fmt.Printf("正常调用的值是 %v\n", v)
}
func plusone(v *int) {
*v++
fmt.Printf("正常调用的值是 %v\n", *v)
}
func main() {
var value = 2022
addone(value)
fmt.Printf("重新查看value的值:%v\n", value)
//如果想彻底的让调用函数之后,重新赋值,最好就是用指针的方式。
var ptr = &value
plusone(ptr)
fmt.Printf("重新查看ptr的值:%v\n", *ptr)
}