go指针详解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值