go语言指针
- 为什么需要指针
- 指针使用实例
- 值传递
- 地址传递
- 多级指针
为什么需要指针
作为一个大学划水,毕业一直写java的程序员来说,多多少少对于指针有点陌生,由于近期需要转go,正好学到指针这里,就来探究下指针的使用场景和用法吧。
首先我们来看下以下这个简单的例子,主方法通过形参将a传递进方法changeValue,然后这个方法将值改变了,那么主方法得到的值是否会改变呢?
import "fmt"/**
指针专题
*/func changeValue(p int) {p = 10
}func main() {var a = 1changeValue(a)fmt.Println("a = ", a)
}
运行后我们发现打印的a的值为1,a并没有因为changeValue这个方法而改变。
究其原因是因为我们调用方法的时候是通过值传递的,而非地址传递,它的模型如下:
因为两个值存在于不同的地址中,所以值没有改变,为了使上述方法能让值得到修改,我们需要通过指针传入地址来让修改的变量值在当前地址中进行修改。
package mainimport "fmt"/**
指针专题
*/func changeValue(p *int) {*p = 10
}func main() {var a = 1changeValue(&a)fmt.Println("a = ", a)
}
因此使用指针过后,修改的为地址的值
指针使用实例
值传递
func swap(a int, b int) {var temp inttemp = aa = bb = temp
}func main() {var a = 10var b = 20swap(a, b)fmt.Println("a=", a, "b=", b)
}
最终a=10 b=20,值并没有改变
地址传递
func swap(pa *int, pb *int) {var temp inttemp = *pa*pa = *pb*pb = temp
}func main() {var a = 10var b = 20swap(&a, &b)fmt.Println("a=", a, "b=", b)
}
最终a=20 b=10,通过地址传递改变了原来的值
多级指针
指向指针的指针称为多级指针
func main() {a := 0//一级指针var p *intp = &afmt.Println(&a)fmt.Println(p)//二级指针var pp **intpp = &pfmt.Println(&p)fmt.Println(pp)
}
打印结果如下
0x1400000e078
0x1400000e078
0x14000046020
0x14000046020