Go语言运算符(超级详细)
Go语言通过算术、关系、逻辑等运算符完成多个数据的计算。
上表中列举的运算符除 % 之外均可用于整型、浮点型和复数型数据运算。% 仅可用于整型数据运算,其运算结果的符号与被除数保持一致。当被除数为正数时,余数也为正数;当被除数为负数时,余数也为负数,与除数是否为正数无关。
注意,如果算术运算结果超出了类型本身的范围,就会发生溢出现象。发生溢出现象后,程序不会有任何异常,但溢出的高位会被丢弃。
举个例子:
使用关系运算符通常会返回一个布尔型值,若大小关系的条件成立,则返回 true,否则返回 false。
举个例子:
Go 语言支持的所有逻辑运算符及其含义如下表所示。
举个例子:
Go语言提供了5个位运算符,如下表所示:
除了上表中的 5 个常见位运算符,Go语言还提供了“&^”运算符,该运算符用于执行按位清空(AND NOT)操作。在使用该运算符时,若运算符右侧数值的第 N 位为 1,则运算结果的第 N 位为 0;若运算符右侧数值的第 N 位为 0,则运算结果的第 N 位为运算符左侧相应位的值。
举例来说,1011&^1001 的结果是 0010。该运算符的目的是保证运算结果中的某位或某几位的值始终为 0。
举个例子:
下图直观地表示了 numOne 与 numTwo 变量的按位与操作过程。
由于 numThree 变量的值为 20,转换为二进制形式后的值为 0001 0100。在对该数值进行左移 2 位操作后,结果为 0101 0000,将其转换回十进制形式后,值为 80。类似地,在对该数值进行右移 2 位操作后,结果为 0000 0101,将其转换回十进制形式后,值为 5。
下图直观地表示了 numThree 变量的左移 2 位操作过程。
下表列举了Go语言支持的所有赋值运算符及其含义。
举个例子:
举个例子:
通过使用指针,程序员可以直接访问内存中的数据,从而实现对数据的精准管理及运算。
算术运算符
算术运算符通常用于数字型数据运算。下表列举了所有算术运算符及其含义。| 算术运算符 | 含 义 |
|---|---|
| + | 相加 |
| - | 相减 |
| * | 相乘 |
| / | 相除 |
| % | 取余数 |
| ++ | 自增1 |
| -- | 自减1 |
上表中列举的运算符除 % 之外均可用于整型、浮点型和复数型数据运算。% 仅可用于整型数据运算,其运算结果的符号与被除数保持一致。当被除数为正数时,余数也为正数;当被除数为负数时,余数也为负数,与除数是否为正数无关。
注意,如果算术运算结果超出了类型本身的范围,就会发生溢出现象。发生溢出现象后,程序不会有任何异常,但溢出的高位会被丢弃。
举个例子:
package main
import (
"fmt"
)
/*算术运算符的使用
*/
func main() {
var expNumOne=5 //声明 expNumOne 变量
var expNumTwo=6 //声明 expNumTwo 变量
fmt.Println(expNumOne+expNumTwo) //输出两个数相加的结果
fmt.Println(expNumOne-expNumTwo) //输出两个数相减的结果
fmt.Println(expNumOne*expNumTwo) //输出两个数相乘的结果
fmt.Println(expNumTwo/expNumOne) //输出两个数相除的结果
fmt.Println(expNumTwo%expNumOne) //输出两个数相除取余数的结果
expNumOne++ //expNumOne变量自增 1
fmt.Println(expNumOne) //输出运算结果
expNumTwo-- //expNumTwo变量自减 1
fmt.Println(expNumTwo) //输出运算结果
var uInt8Max uint8=255 //声明uInt8Max变量,类型为uint8,值为该类型最大值
fmt.Println(uInt8Max+1) //输出运算结果
var int8Max int8=127 //声明int8Max变量,类型为uint8,值为该类型最大值
fmt.Println(int8Max+1) //输出运算结果
}
运行结果如下:
11
-1
30
1
1
6
5
0
-128
关系运算符
关系运算符用于表示两个值的大小关系。下表列举了所有关系运算符及其含义。| 关系运算符 | 含 义 |
|---|---|
| == | 相等 |
| != | 不相等 |
| < | 小于 |
| <= | 小于或等于 |
| > | 大于 |
| >= | 大于或等于 |
使用关系运算符通常会返回一个布尔型值,若大小关系的条件成立,则返回 true,否则返回 false。
举个例子:
package main
import (
"fmt"
)
/*关系运算符的使用
*/
func main() {
fmt.Println(100==(50+50)) //输出 100 与 50+50 的值是否相等
fmt.Println((51+49)!=(50*2)) //输出 51+49 与 50*2 的值是否不相等
var text string = "abcde" //声明字符串型变量 text,值为"abcde"
fmt.Println(text[0]==97) //输出text变量中首个字符的ASCII值是否与97相等
}
运行结果如下:
true
false
true
逻辑运算符
逻辑运算符,有时又被称为逻辑连接词。顾名思义,它可以将两个逻辑命题连接起来,组成新的语句或命题,最终形成复合语句或复合命题,其返回结果为布尔型值。Go 语言支持的所有逻辑运算符及其含义如下表所示。
| 逻辑运算符 | 含 义 |
|---|---|
| && | 逻辑与(AND),当运算符前后两个条件的结果均为 true 时,运算结果为 true |
| || | 逻辑或(OR),当运算符前后两个条件的结果中有一个为 true 时,运算结果为 true |
| ! | 逻辑非(NOT),对运算符后面的条件的结果取反,当条件的结果为 true 时,整体运算结果为 false,否则为 true |
举个例子:
package main
import (
"tmt"
)
/*逻辑运算符的使用
*/
func main() {
fmt.Println(true&&false) //输出 true 和 false 的逻辑与结果
fmt.Println(true||false) //输出 true 和 false 的逻辑或结果
fmt.Println(!(true&&false)) //输出true和false的逻辑与结果的逻辑非结果
}
运行结果如下:
false
true
true
位运算符
位运算符提供了整型数据的二进制位操作。在计算机内部,所有的数据都是由二进制的 0 和 1 进行存储的,整型数据也不例外。整型数据经过位运算后,可以得到按位操作后的新数值。Go语言提供了5个位运算符,如下表所示:
| 位运算符 | 含 义 |
|---|---|
| & | 按位与(AND)操作,其结果是运算符前后的两数各对应的二进制位相与后的结果 |
| | | 按位或(OR)操作,其结果是运算符前后的两数各对应的二进制位相或后的结果 |
| ^ | 按位异或(XOR)操作,当运算符前后的两数各对应的二进制位相等时,返回 0;反之,返回 1 |
| << | 按位左移操作,该操作木质上是将某个数值乘以 2 的 n 次方,n 为左移位数。更直观地来看,其结果就是将某个数值的所有二进制位向左移了 n 个位置,并将超限的高位丢弃,低位补 0 |
| >> | 按位右移操作,该操作本质上是将某个数值除以 2 的 n 次方,n 为右移位数。更直观地来看,其结果就是将某个数值的所有二进制位向右移了 n 个位置,并将超限的低位丢弃,高位补 0 |
除了上表中的 5 个常见位运算符,Go语言还提供了“&^”运算符,该运算符用于执行按位清空(AND NOT)操作。在使用该运算符时,若运算符右侧数值的第 N 位为 1,则运算结果的第 N 位为 0;若运算符右侧数值的第 N 位为 0,则运算结果的第 N 位为运算符左侧相应位的值。
举例来说,1011&^1001 的结果是 0010。该运算符的目的是保证运算结果中的某位或某几位的值始终为 0。
举个例子:
package main
import (
"fmt"
)
/*位运算符的使用
*/
func main() {
var numOne int=0 //声明 numOne 变量
var numTwo int=1 //声明 numTwo 变量
fmt.Println(numOne&numTwo) //输出 numOne 和 numTwo 变量的按位与结果
fmt.Println(numOne|numTwo) //输出 numOne 和 numTwo 变量的按位或结果
fmt.Println(numOne^numTwo) //输出 numOne 和 numTwo 变量的按位异或结果
fmt.Println(numOne&^numTwo) //输出 numOne 和 numTwo 变量的按位清空结果
var numThree int=20 //声明 numThree 变量
fmt.Println(numThree<<2) //输出 numThree 变量左移 2 位后的结果
fmt.Println(numThree>>2) //输出 numThree 变量右移 2 位后的结果
}
运行结果如下:
0
1
1
0
80
5
下图直观地表示了 numOne 与 numTwo 变量的按位与操作过程。

由于 numThree 变量的值为 20,转换为二进制形式后的值为 0001 0100。在对该数值进行左移 2 位操作后,结果为 0101 0000,将其转换回十进制形式后,值为 80。类似地,在对该数值进行右移 2 位操作后,结果为 0000 0101,将其转换回十进制形式后,值为 5。
下图直观地表示了 numThree 变量的左移 2 位操作过程。

赋值运算符
赋值运算符用于为某个变量或常量赋值。除了最简单的“=”,Go语言还提供了多种丰富的赋值运算符。在大多数情况下,使用赋值运算符可以简化编码。下表列举了Go语言支持的所有赋值运算符及其含义。
| 赋值运算符 | 含 义 |
|---|---|
| = | 直接将运算符右侧的值赋给左侧的变量或表达式 |
| += | 先将运算符左侧的值与右侧的值相加,再将相加和赋给左侧的变量或表达式 |
| -= | 赋给左侧的变量或表达式侧的值相减,再将相减差赋给左侧的变量或表达式 |
| *= | 先将运算符左侧的值与右侧的值相乘,再将相乘结果赋给左侧的变量或表达式 |
| /= | 先将运算符左侧的值与右侧的值相除,再将相除结果赋给左侧的变量或表达式 |
| %= | 先将运算符左侧的值与右侧的值相除取余数,再将余数赋给左侧的变量或表达式 |
| <<= | 先将运算符左侧的值按位左移右侧数值指定数量的位置,再将位移后的结果赋给左侧的变量或表达式 |
| >>= | 先将运算符左侧的值按位右移右侧数值指定数量的位置,再将位移后的结果赋给左侧的变量或表达式 |
| &= | 先将运算符左侧的值与右侧的值按位与,再将位运算后的结果赋给左侧的变量或表达式 |
| |= | 先将运算符左侧的值与右侧的值按位或,再将位运算后的结果赋给左侧的变量或表达式 |
| ^= | 先将运算符左侧的值与右侧的值按位异或,再将位运算后的结果赋给左侧的变量或表达式 |
举个例子:
package main
import (
"fmt"
)
/*赋值运算符的使用
*/
func main() {
var numOne int=20 //声明 numOne 变量
numOne+=20 //numOne=numOne+20
fmt.Println(numOne) //输出 numOne 变量的值
numOne-=10 //numOne=numOne-10
fmt.Println(numOne) //输出 numOne 变量的值
numOne*=100 //numOne=numOne*100
fmt.Println(numOne) //输出 numOne 变量的值
numOne/=20 //numOne=numOne/20
fmt.Println(numOne) //输出 numOne 变量的值
num0ne%=4 //num0ne=num0ne&4
fmt.Println(numOne) //输出 numOne 变量的值
num0ne<<=2 //numOne=numOne<<2
fmt.Println(numOne) //输出 numOne 变量的值
num0ne>>=3 //numOne=num One>>3
fmt.Println(numOne) //输出 numOne 变量的值
numOne&=0 //numOne=numOne&0
fmt.Println(numOne) //输出 numOne 变量的值
numOne^=1 //numOne=numOne^1
fmt.Println(numOne) //输出 numOne 变量的值
numOne|=0 //numOne=numOne|0
fmt.Println(numOne) //输出 numOne 变量的值
}
运行结果如下:
40
30
3000
150
2
8
1
0
1
1
指针运算符
Go语言提供了两个指针运算符,如下表所示。| 指针运算符 | 含 义 |
|---|---|
| & | 获取某个变量在内存中的实际地址 |
| * | 声明一个指针变量 |
举个例子:
package main
import "fmt"
/*指针运算符的使用
*/
func main() {
var numOne int=5 //声明 numOne 变量,类型为 int,值为 5
var pointer *int=&numOne //声明pointer变量,类型为指针,值为numOne变量的内存地址
fmt.Println(&numOne) //输出numOne变量的实际内存地址
fmt.Println(*pointer) //输出pointer变量表示的内存地址所存储的变量的值
}
运行结果如下:
0x1400012a008
5
通过使用指针,程序员可以直接访问内存中的数据,从而实现对数据的精准管理及运算。
ICP备案:
公安联网备案: