golang的指针的一些理解

Go 有指针,但是没有指针运算。感谢谷歌Rob Pike大佬放我一条狗命!

通过类型作为前缀来定义一个指针’ * ’:var Pointer * int。现在 Pointer 是一个指向整数值的指针。所有新定义的变量都被赋值为其类型的零值,而指针也一样。一个新定义的或者没有任何指向的指针,有值 nil。在其他语言中,这经常被叫做空(NULL)指针,在 Go 中就是 nil 。让指针指向某些内容,可以使用取址操作符 ( & )。

定义一个指针类型的变量可以通过一个前缀’ * ’来定义。例如:var Pointer * int。现在 Pointer 是一个指向整数值的指针。

在golang中所有新定义的变量都被赋值为其类型的零值,指针也是一样的,初始未赋值的时候为,让指针指向某个数据的时候,可以使用取值符&

 package main 
     
 import "fmt"
   
 func main() {
     var Pointer  *int 
     fmt.Printf("%v\n",Pointer ) //← 打印 nil
     num := 1
     Pointer  = &num    //← 使得 Pointer   指向 num, 获取 num 的地址
     fmt.Printf("%v\n",Pointer) //正常打印获得的时候只是内存地址,如果想获取变量所代表的值得用如下方式
     fmt.Printf("%v\n",*Pointer  ) //打印1
  
 }

在golang中,我个人理解,只有一种传递,就是按值传递,一个变量作为参数传递的时候,会创建一个原变量的复制体,然后进行传递给函数或者是方法。还有另外一种情况就是,变量作为指针传递,这个时候是一个新的指针被复制,它指向的是同样的内存地址,是原始变量指针的复制体。

指针与普通变量区别

这个星期公司的同事也开始学习golang了,然后不是很明白普通变量与指针的区别,然后就来问我,我也是一脸懵逼,平时只是使用了,并没有怎么真正的去了解过,然后我跟我的同事们探讨了一下go中的指针到底是个什么玩意。

定义一个变量a 然后数据类型为整形,那么在编译时 就会有假设 [a 地址 int] 这样来标识内存(百度的,我也不知道是否正确,个人感觉也就是这么回事),普通变量a其实是语言本身创造了,是为了更方便的表示内存。我们对a进行访问其实就是直接对内存进行访问。至于a表示的内存的地址是多少,呵呵呵,之前用PHP的时候根本就不关心,内存地址是啥玩意啊,可以吃吗。然后编译器会自动分配地址,也就是常说的为a分配一个地址。如果想知道a的地址也可以通过取值符 &a得到。大白话解释就是,普通变量就是城市(内存)中的一个房子,而指针就是告诉你这座房子在哪的门牌号。

package main
 
func main(){
    a := 1   //此时有一块内存存放了1,它的地址由系统自动分配,别名是a
    a = 2   //,这个时候更新了内存别名为a的值为2
    var p *int // 定义了一个真正变量
    p = &a   //拿到了a的内存地址
    ptr := new(int)    //申请内存的时候,指针的存在意义之一就被体现出来了
    //申请了一块内存空间,没有办法指定别名,new()返回内存地址,用指针接收,所以ptr自动推导成指针类型
    //此时并没有变量能直接指向这块内存,所以只能通过内存地址来访问
}

什么时候用普通变量,什么时候用指针呢

在之前的工作当中,对函数的参数以及返回值定义成普通变量还指针变量一直比较随意,经过一番了解之后大概可以这么区分。

大概的判断标准是看变量的创建的成本和需求。

不想变量被修改。 如果你不想变量被函数和方法所修改,就选择普通变量。反之,如果想修改原始的变量,则选择指针变量。
如果变量是一个大的结构体或者数组,则复制体的创建相对会影响性能,这个时候考虑使用指针变量,只创建新的指针,在高并发的情况下,区别还是很大的。
(不针对函数参数,只针对本地变量/本地变量)对于函数作用域内的参数,如果定义成P,Go编译器尽量将对象分配到栈上,而指针变量很可能会分配到对象上,这对垃圾回收会有影响

零值与nil(空指针)

变量声明而没有赋值,默认为零值,不同类型零值不同,例如字符串零值为空字符串;

指针声明而没有赋值,默认为nil,即该指针没有任何指向。当指针没有指向的时候,不能对指针变量进行操作包括读取,否则会报空指针异常。
解决方法即给该指针分配一个指向,即初始化一个内存,并把该内存地址赋予指针变量,或者通过new开辟一个内存,并返回这个内存的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值