go语言中符号的意思 go语言标识符

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

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

创新互联公司专注于企业成都营销网站建设、网站重做改版、东兴网站定制设计、自适应品牌网站建设、成都h5网站建设商城网站开发、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为东兴等各大城市提供网站开发制作服务。

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

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

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

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

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

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

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

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

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

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

go语言操作符 ^ 和 &^

很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。

如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。

操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。

对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反

计算过程

以3为例  3在内存中补码为 0*** 0011

取反            1*** 1100

-1操作          1*** 1011

除符号位取反    1*** 0100 结果为-4

-------------------------------------------

以9为例 9在内存中补码为 0*** 1001

取反            1*** 0110

-1操作          1*** 0101

除符号位取反    1*** 1010 结果为-10

-------------------------------------------

以-5为例 -5在内存中为的补码为 1*** 1011

为什么呢

-5源码          1*** 0101

除符号取反      1*** 1010

+1操作          1*** 1011

-------------------------------------------

那么-5取反怎么算

补码 1***1011取反为 0***0100

因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是4

===================================

再看-1

-1源码          1*** 0001

除符号取反      1*** 1110

+1操作          1*** 1111

补码 1*** 1111 取反为 0*** 0000

因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是0

go语言取反输出的例子看这里

go中&^(按位置零)符号的含义

go中有一个 ^ 的运算符,它代表的是按位置零

首先来看下几个输出例子:

输出结果为:

可以看出。结果是又右边的数值决定的。

z = x ^ y

如果y非零,则z为0

如果y为零,则z为x

golang里面表示指针的*和&符号有什么区别

指针,或者说pointer是一串指向某个内存地址的字符串,所谓指向是指这串字符串的内容是内存地址的值

表示取地址,例如你有一个变量a那么a就是变量a在内存中的地址,对于golang,指针也是有类型的,比如如果a是一个string那么a是一个string的指针类型,在go里面叫string

所以你看到b := a,a,b是两个不同的变量,a是string类型,b是string类型,你用fmt去打印b,你会发现它是一串内存地址,而非a的值

所以为了拿到a的值,有个操作*,用来取出指针对应内存地址里存的值,所以当你fmt打印一下*b它会跟a一模一样


分享文章:go语言中符号的意思 go语言标识符
URL分享:http://pwwzsj.com/article/doogods.html