浅谈Go指针的基本使用

214 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13天,点击查看活动详情

本文主要介绍Go的指针类型的基本使用,快速上车

基本概念

指针,简单的说就是内存地址(ps~门牌号)。存放内存地址的变量,叫做指针变量

Go的指针不能进行偏移和运算,所以Go的指针非常简单,是安全指针

着重记住:

  • 两个符号& 取地址,* 根据地址取值
  • 三个概念指针地址指针类型指针取值

指针地址

使用&,获取对应变量的内存地址

a := 111
b := &a                                           //b存放a的内存地址,所以b是指针类型
fmt.Println(fmt.Sprintf("ptr:%p type:%T", &a, a)) //ptr:0xc0000ae010 type:int
fmt.Println(fmt.Sprintf("ptr:%p type:%T", b, b))  //ptr:0xc0000ae010 type:*int

指针类型

Go值类型(intfloatboolstringarraystruct),都有对应的指针类型,使用*表示。例如 *int*string*float32等;

Go引用类型(slicemapchannel),这些类型本身就是指针类型,所以不用*表示

注意:指针类型的默认值是 nil

指针取值

使用*,从指针变量中取值

a := 111
b := &a                                           
fmt.Println(a, *b) //111 111
*b = 222
fmt.Println(a, *b) //222 222

注意:通过指针变量修改值,那么原始变量的值也会发生改变,因为操作的是同一个内存空间的数据

指针类型变量必须初始化

错误写法:未初始化,会导致panic

var num *int
*num = 100
fmt.Println(num)

//panic: runtime error: invalid memory address or nil pointer dereference

var m map[string]string
m["name"] = "zhangsan"
fmt.Println(m)

//panic: assignment to entry in nil map

正确写法 :使用newmake做初始化,分配内存地址

var num *int
num = new(int)  //使用new分配地址
*num = 100
fmt.Println(num) //0xc00001a098

var m map[string]string
m = make(map[string]string) //使用make分配地址
m["name"] = "zhangsan"
fmt.Println(m, fmt.Sprintf("%p", m)) //map[name:zhangsan] 0xc000100030

备注:new和make使用上是有区别的,可以通过之前分享的这篇文章《Go new和make的区别》,进一步学习。

总结

Go的指针非常简单,记住两个符号&*)、三个概念指针地址指针类型指针取值),以及在使用指针类型的变量时,记住必须先做初始化,然后再进行使用

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!