go语言指针的定义 go语言指针和c++一样吗

GO 一文搞懂指针和地址值的区别

go语言中的指针和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符号的使用,可能会让你摸不透,本文希望能讲清楚go语言的指针(pointer)和值(value)。

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、成都网站建设、永城网络推广、成都微信小程序、永城网络营销、永城企业策划、永城品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供永城建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com

这里先简单的对指针和地址值概念做一个定义:

这是因为go方法传递参数的方式导致的,go方法函数传递参数传递的是一个拷贝,看看下面的程序会输出什么?

答案是8,而不是9,因为AddAge函数修改的是学生的一个备份,而不是原始的学生对象

如果你想正确的给学生年龄增加的话,函数传递的需要是这个值的指针,如下所示:

需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如,如果你将s赋值给另外一个指针地址,不会影响原有的指针,这点可以自行实践下。

那在使用go语言开发的时候,何时该用指针何时改用地址值呢?比如考虑以下场景:

简单原则: 当你不确定该使用哪种的时候,优先使用指针

如果考虑在数组、切片、map等复合对象中使用指针和值,比如:

很多开发者会认为b会更高效,但是被传递的都是一个切片的拷贝,切片本身就是一个引用,所以这里被传递的其实没有什么区别。

对于指针和地址值的使用,大家需要牢记的一点就是go数据传递的不可变性,活学活用此特点,在无状态函数中此特性非常有用。

【Go参数传递:值类型、引用类型和指针类型】

修改参数

值类型

指针类型

引用类型

chan

类型零值

总结 :在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语言里面的指针和C++指针一样,都是指向某块内存的地址值,可以解引用,不同只是在于C++里可以直接对指针做算术运算而Go里面不行。


标题名称:go语言指针的定义 go语言指针和c++一样吗
标题网址:http://scyanting.com/article/dojppgc.html