Golang中的指针是什么?
admin
2023-02-16 01:00:04
0

本文以Golang中的指针为例,为大家分析Golang中的指针地址和指针类型以及取值的使用方法。阅读完整文希望大家对Golang中的指针有一定的认识。

1.指针概念

任何数据载入内存后,在内存中都有对应的地址,这就是指针。
为了保存一个数据在内存中的地址,需要指针变量。
比如"好好学习,天天向上"这个字符串写入程序中,程序一启动这句话就加载到内存(假设内存地址为0x123456),在程序中,把该字符串赋值给变量A,把该字符串的内存地址赋值给变量B。
这时变量B就是一个指针变量。通过变量A和变量B都能找到该字符串。
Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。
也需要记得:
值类型有:int、float、bool、string、array、struct
引用类型有:指针,map,切片,chan

1.1指针地址和指针类型

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
Go语言中使用&字符放在变量前面对变量进行“取地址”操作。
Go语言中的值类型(int,float,bool,string,array,struct)都有对应的指针类型,如*int,*in64,*string等。

取变量指针的语法如下:
ptr := &v    // v的类型为T

其中:
v:代表被取地址的变量,类型为T
ptr:用于接收地址的变量,ptr的类型就是*T,称作T的指针类型。*代表指针。

package main

import "fmt"

func main() {
    a:=10
    b:=&a
    fmt.Printf("a:%d ptr:%p\n",a,&a)
    fmt.Printf("b:%p type:%T\n",b,b)
    fmt.Println(&b)
}
结果:
a:10 ptr:0xc000054080
b:0xc000054080 type:*int
0xc000080018

Process finished with exit code 0

Golang中的指针是什么?

1.2指针取值

在对普通变量使用&操作符取地址后,会获得这个变量的指针,然后可以对指针使用*操作,即指针取值。

package main

import "fmt"

func main() {
    a:=10
    b:=&a
    fmt.Printf("type of b:%T\n",b)
    c:=*b
    fmt.Printf("type of c:%T\n",c)
    fmt.Printf("value of c:%v\n",c)
}
结果:
type of b:*int
type of c:int
value of c:10

Process finished with exit code 0
总结:
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
1.对变量进行取地址(&)操作,可以获取这个变量的指针变量。
2.指针变量的值是指针地址。
3.对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。
package main

import "fmt"

func modify1(x int)  {
    x = 100
}
func modify2(x *int)  {
    *x = 100
}
func main() {
    a:=10
    modify1(a)
    fmt.Println(a)//10
    modify2(&a)
    fmt.Println(a)//100
}

1.3new和make

先看一个例子:

func main() {
    var a *int
    *a = 100
    fmt.Println(*a)

    var b map[string]int
    b["沙河娜扎"] = 100
    fmt.Println(b)
}

结果:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x494aaa]

goroutine 1 [running]:
main.main()
    C:/Users/Administrator/Desktop/go/src/myproject1/test.go:7 +0x2a

Process finished with exit code 2

上面的代码引发了panic,在Go语言中,对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们值就没办法存储。
对于值类型的声明,不需要分配内存空间,因为在声明的时候,已经默认分配好了内存空间。
要分配内存,就引出了new和make,Go语言中使用new和make来分配内存。

1.3.1new

new是一个内置函数,它的函数签名如下:
func new(Type) *Type
其中,
Type表示类型,new函数只接收一个参数,这个参数是一个类型。
*Type表示指针类型,new函数返回一个指向该类型内存地址的指针。
new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。

package main

import "fmt"

func main() {
    a:=new(int)
    b:=new(bool)
    fmt.Printf("%T\n",a)//*int
    fmt.Printf("%T\n",b)//*bool
    fmt.Println(*a)//0
    fmt.Println(*b)//false
}
本节开始的示例代码中,var a *int只是声明了一个指针变量a,但是没有初始化,指针作为引用类型,需要初始化后才能拥有内存空间,才能给它赋值。
应该按照如下方式,使用内置的new函数对a进行初始化后才可以正常进行赋值。

func main() {
    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)
}

1.3.2make


make也是用于内存分配的,与new相比,make只用于slice、map及chan的内存创建,而且它的返回类型就是三个类型本身,不是他们的指针类型,

因为这三种类型就是引用类型,所以没必要返回指针了。

make函数的函数签名如下: func make(t Type, size ...IntegerType) Typ make函数是无可替代的,我们在使用slice、map、及channel的时候,都要使用make进行初始化,然后才可以对它们进行操作。channel我们稍后讲解。 本节开始的实例中var b map[string]int只是声明变量b是一个map类型的变量,需要像下面的示例代码一样使用make函数进行初始化操作后,才能对其进行键值对赋值。 func main() {    var b map[string]int    b = make(map[string]int, 10)    b["沙河娜扎"] = 100    fmt.Println(b) }
new与make的区别
1.两者都是用来做内存分配的。
2.make只用于slice、map及channel的初始化,返回的还是三中类型本身。
3.new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

看完上述内容,你们对Golang中的指针有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

上一篇:golang中结构体的使用

下一篇:R语言笔记

相关内容

热门资讯

安全生产许可证状态不是“有效”... 工程公司的安全生产许可证在官方系统显示为“其他”状态,有一栏则显示“整改”,却成为高标准农田项目的第...
深化产教融合 推进数智育人 哈... 7月23日,由阿里国际人工智能人才孵化中心(以下简称“阿里国际AITIC”)主办的“智启未来·数智赋...
中国工程院举办学习陈立泉、贲德... 北京7月24日电 (记者 孙自法)中国工程院7月24日在北京举办学习陈立泉、贲德院士科学家精神座谈会...
从成都看低空经济,专访杨军:万... 电子科技大学教授、深思实验室主任杨军接受封面新闻记者专访 封面新闻记者 王一理 摄影 陈光旭 近年来...
蚂蚁集团副总裁张俊杰:希望与成... 7月24日下午,APEC人工智能高级别论坛在成都举行。会议期间,蚂蚁集团副总裁、健康事业群总裁张俊杰...
北大博雅塔为王虹邓煜亮灯 极目新闻记者 陈洋洋7月24日晚,多位北京网友发帖称,在北京大学校园内的博雅塔上,看到了庆祝中国数学...
要和马六甲争高下的陆桥黄了,暴... (文/观察者网 郭光昊、张菁娟)绕开马六甲海峡,在泰国南部的狭窄地峡上“劈开一个口子”。这是每个中国...
AI做科研,走过概念期 2024年,诺贝尔化学奖颁给了谷歌DeepMind的两位人工智能科学家德米斯·哈萨比斯和约翰·杰珀,...
FLUX 3多模态AI模型登场... IT之家 7 月 24 日消息,Black Forest Labs 昨日(7 月 23 日)发布博文...
广州远联取得带全方位保护结构的... 国家知识产权局信息显示,广州远联物流服务有限公司取得一项名为“一种带全方位保护结构的升降平台”的专利...