Golang 指针和结构体于c语言相同,go中也有指针和结构体的概念 。指针表示变量的内存地址 , 结构体用来存储同一类型的数据 。
定义一个指针变量 , 将变量a的地址赋给指针变量p 。这样,指针变量p也就指向了变量a所在的内容空间 。
new 函数返回一个指针变量
fmt.scan() 就是传入一个指针变量 。
两种方法都可以使用 。
以上简要介绍了go语言中的指针和结构体 。
golang-指针类型 tips: *号,可以指向指针类型内存地址上的值 , 号,可以获取值类型的内存地址
每一个变量都有内存地址,可以通过变量来操作内存地址中的值,即内存的大小
go语言中获取变量的内存地址方法:通过符号可以获取变量的地址
定义:普通变量存储的是对应类型的值 , 这些类型就叫值类型
变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156
定义:指针类型的变量存储的是?个地址 , 所以?叫指针类型或引?类型
b 是值类型,它指向的是内存地址上的值
a是指针类型,它指向的是b的内存地址
指针类型定义,语法: var 变量名 *类型
指针类型在定义完成后 , 默认为空地址,即空指针(nil)
在定义好指针变量后,可以通过***** 符号可以获取指针变量指向的变量
在这里的 *a 等价于 b , 通过修改 *a,最终修改的是值类型b的值
这里a,d是值类型 , b,c是指针类型
d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响
b,c相当于指向了a的内存地址,当使用*号引用出内存地址上的变量上 , 修改值得,a的值也会跟着改变
GO 一文搞懂指针和地址值的区别 go语言中的指针和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符号的使用,可能会让你摸不透,本文希望能讲清楚go语言的指针(pointer)和值(value) 。
这里先简单的对指针和地址值概念做一个定义:
这是因为go方法传递参数的方式导致的,go方法函数传递参数传递的是一个拷贝,看看下面的程序会输出什么?
答案是8 , 而不是9,因为AddAge函数修改的是学生的一个备份,而不是原始的学生对象
如果你想正确的给学生年龄增加的话 , 函数传递的需要是这个值的指针,如下所示:
需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如 , 如果你将s赋值给另外一个指针地址,不会影响原有的指针,这点可以自行实践下 。
那在使用go语言开发的时候,何时该用指针何时改用地址值呢?比如考虑以下场景:
简单原则: 当你不确定该使用哪种的时候,优先使用指针
如果考虑在数组、切片、map等复合对象中使用指针和值,比如:
很多开发者会认为b会更高效,但是被传递的都是一个切片的拷贝,切片本身就是一个引用,所以这里被传递的其实没有什么区别 。
对于指针和地址值的使用,大家需要牢记的一点就是go数据传递的不可变性,活学活用此特点,在无状态函数中此特性非常有用 。
go语言中指针的使用场景?如果该函数会修改receiver,此时一定要用指针
如果receiver是 struct 并且包含互斥类型 sync.Mutex ,或者是类似go语言指针法的同步变量,receiver必须是指针,这样可以避免对象拷贝
如果receiver是较大go语言指针法的 struct 或者 array ,使用指针则更加高效 。多大才算大go语言指针法?假设struct内所有成员都要作为函数变量传进去,如果觉得这时数据太多,就是struct太大
如果receiver是 struct,array 或者 slice,并且其中某个element指向了某个可变量 , 则这个时候receiver选指针会使代码的意图更加明显
如果receiver使较小的 struct 或者 array ,并且其变量都是些不变量、常量,例如 time.Time,value receiver更加适合 , 因为value receiver可以减少需要回收的垃圾量 。
【go语言指针法 go 语言指针】关于go语言指针法和go 语言指针的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 翡翠直播灯是什么灯,翡翠直播灯是什么灯光
- 宁德考编公众号关注,宁德考编有地区限制吗
- mysql数据库的优化面试题,MySQL数据库面试题
- 光猫不支持路由器怎么连接,光猫不支持千兆路由器
- oracle如何导出照片 oracle从本地保存图片到字段
- vsoracle连接字符串,vs2017连接oracle数据库
- 硬盘怎么查找以前的文件,如何能查找旧硬盘里面的文件
- 包含超群棋牌游戏的词条
- php数据统计并排序 php数据统计分析