1、程序运行原理
程序运行时,数据都是存放在内存中的,那么每一个存储在内存中的数据都会有一个编号,这个编号就是内存地址,而内存地址可以被赋值给一个指针。
内存地址,用16进制表示。可以将指针理解为内存地址;
理解:一本书,书的右下角会有数字页码,那么数字页面就可以认为是指针。页面里面的内容,就是指针的值,可以是对象,文本,数字等等;
2、指针类型如何声明、定义,有那些类型?
在对应的类型前面加上*,就是对应的指针类型。如
var intS *string
name := "张三"
namep := &name //指针类型不同,无法复制,相同指针类型,才可以赋值;
3、指针有那些操作呢?
a、获取指针的值。 nickname := *namep,则nickname = "张三"
b、修改指针的值。修改的指针对应的地址的内存的值;
var intp *int = new(int) //分配内存
intp = 10
num := intp
*num = 100;
输出intp的值为:100,因为修改的是对应内存地址的值,所以num和intp指向的是同一个地址,所以值改变,是内存空间的值进行改变。
在需要使用,形参改变实参的值的时候,需要使用指针的参数。
4、指针的好处?
- 可以修改指向数据的值
- 在变量赋值时,参数传值时可节省内存
5、什么情况下使用指针?
- 不要对map,slice,channel这类引用类型使用指针
- 像int,bool这类小的数据类型,不要使用指针
- 指针最好不要嵌套。不要使用一个指针的指针
- 如果需要修改方法接收者内部的数据或者状态时,需要使用指针
- 如果需要修改参数的值或者内部数据时,也需要使用指针类型的参数
- 如果是比较大的指针结构体,可以考虑使用指针
- 如果需要并发安全,则尽可能不要使用指针;使用指针,一定要确保,并发安全