1、指针的概念
内存是什么?
我们在编程的时候,实际上就是在操作内存,除非是进行IO操作写磁盘,否则都是在内存中增删改查
计算机的内存,就是一系列有序列号的存储单元,好比一家酒店,有一个接一个的按序排列的房子,
房间里的东西,就是内存里存储的值
那么在内存中,如何快速寻找一个值?答案是地址,只有用地址访问是最快的
可是屋子太多了,多到很容易记错地址,比如我想找吃饭的地方,地址是XX酒店XX楼XX号房间
地址太长可能导致记忆困难、操作失误等等(类似于ip地址),所以现代的编程语言对于用户隐藏了操作内存的细节,衍生出了变量的概念
变量是什么?
变量是一个代表内存地址的字母数字组合、也可以是一个标签或者一个昵称,用于引用计算机的内存地址。比如:餐厅(XX酒店XX楼XX号房间),我如果想找吃饭的地方,不需要记下来详细地址了,直接找餐厅就可以了,餐厅就代表了XX酒店XX楼XX号房间
指针是什么
指针也是变量,它的值是另一个变量的内存地址,比如餐厅的指针(XX酒店XX楼XX号房间)
2、指针的作用
指针使用
第一,当作为方法的receiver时,如果你的方法会改变receiver时,必须传递指针…
在Go语言中,默认是按值传递.当一个变量当作参数传递的时候,会创建一个变量的副本, 然后传递给函数或者方法,对该副本的操作不会影响到原始变量
当变量当做指针被传递的时候,一个新的指针被创建,它是原始变量指针的副本,和原始指针指向同样的内存地址, 对该指针的操作会影响到原始变量
package main
import "fmt"
func main() {
// &取地址符 例如:{指针}:=&{变量}
// *取值符 例如:{变量}:=*{指针}
var ptr *string // 声明指针 初始值为nil
a := 1
b := 2
swap(a, b) // 值传递
fmt.Println(a, ",", b) // 输出1,2
swapPoint(&a, &b) // 指针传递 使用&获取变量地址
fmt.Println(a, ",", b) // 输出 2,1
// 空指针判断
if(ptr != nil) /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */
}
func swap(a, b int) {
t := a
a = b
b = t
}
func swapPoint(a, b *int) {
t := *a // 获取a指针指向的变量 赋给t
*a = *b // 将b指针指向的变量的值 赋给 a指针指向的变量
*b = t // 将t的值 赋给b指针指向的变量
}
第二,作为入参时,golang是值拷贝传递, 如果是比较大的struct作为参数,那么显然拷贝一个指针比拷贝整个结构代价要小一些,节省内存
空指针
指针变量通常缩写为 ptr(Pointer),当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针,对空指针不能进行读取操作,会抛空指针异常
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值
总结
指针是一个特殊的变量,它里面存储的是另一个变量的内存地址,&操作符获取变量地址,*操作符获取指针指向的变量的值
只声明未赋值的指针,默认值为nil 没有分配内存 不可取值
函数方法的接受者,是指针变量时候,指针会被拷贝传入方法中,拷贝的指针,其指向的地方与原有指针一样,所以可以修改原始变量
文章引用:https://www.jianshu.com/p/61b1a958e3ab
文章引用:https://zhuanlan.zhihu.com/p/80261614