欢迎来到张胤尘的技术站
技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌
golang
中支持运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、指针运算符。
在 golang
中,算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法和取模等。如下表所示:
算术运算符 | 含义 |
---|---|
+ |
相加 |
- |
相减 |
* |
相乘 |
/ |
相除 |
% |
求余 |
++ |
自增 |
-- |
自减 |
package main
import "fmt"
func main() {
i, j := 10, 20
fmt.Println(i + j) // 30
fmt.Println(i - j) // -10
fmt.Println(i * j) // 200
fmt.Println(i / j) // 0
fmt.Println(i%2, j%2) // 0, 0
i++
fmt.Println(i) // 11
j++
fmt.Println(j) // 21
}
int
类型),结果也是整数。例如,10 / 3
的结果是 3
。float32
或 float64
),结果是浮点数。例如,10.0 / 3
的结果是 3.3333333333333335
。%
只能用于整数类型。如果需要对浮点数进行类似操作,需要手动实现。++
和 --
是后缀运算符(golang
不存在前缀运算符),表示在表达式计算完成后对变量进行加 1 或减 1 操作。在 golang
中,关系运算符用于比较两个操作数之间的关系,返回布尔值(true
或 false
)。
关系运算符 | 含义 |
---|---|
== |
等于 |
!= |
不等于 |
> |
小于 |
< |
大于 |
>= |
大于等于 |
<= |
小于等于 |
package main
import "fmt"
func main() {
i, j := 10, 20
fmt.Println(i == j) // false
fmt.Println(i != j) // true
fmt.Println(i > j) // false
fmt.Println(i < j) // true
fmt.Println(i >= j) // false
fmt.Println(i <= j) // true
}
在 golang
中,逻辑运算符用于对布尔值进行逻辑操作,通常用于组合或修改条件表达式。
逻辑运算符 | 含义 |
---|---|
&& |
逻辑与(AND ) |
|| |
逻辑或(OR ) |
! |
逻辑非(NOT ) |
package main
import "fmt"
func main() {
i, j := true, false
fmt.Println(i && j) // false
fmt.Println(i || j) // true
fmt.Println(!i) // false
fmt.Println(!j) // true
fmt.Println(!(i && j)) // true
fmt.Println(!(i || j)) // false
}
&&
和 ||
时,golang
会执行短路逻辑:
a && b
,如果 a
为 false
,则不会计算 b
,直接返回 false
。a || b
,如果 a
为 true
,则不会计算 b
,直接返回 true
。bool
类型),不能用于其他类型(如整数或字符串)。在 golang
中,位运算符用于对整数的二进制位进行操作。这些运算符可以直接操作整数的每一位,常用于底层编程、性能优化或处理特定的算法问题。
位运算符 | 含义 | 解释 |
---|---|---|
& |
位与(AND ) |
当两个操作数对应位都为1 时,结果位才为1 |
| |
位或(OR ) |
当两个操作数中有一个对应位为1 ,结果位就为1 。 |
^ |
位异或(XOR ) |
两个操作数的对应位不相同时,结果位为1 。 |
<< |
左移运算符 | 将操作数的二进制表示向左移动指定的位数 |
>> |
右移运算符 | 将操作数的二进制表示向右移动指定的位数 |
package main
import "fmt"
func main() {
// i的二进制00111100
// j的二进制00001101
i, j := 60, 13
k := 1
fmt.Println(^k) // 11111110(-2)
fmt.Println(i & j) // 00001100(12)
fmt.Println(i | j) // 00111101(61)
fmt.Println(i ^ j) // 00110001(49)
fmt.Println(i << 1) // 01111000(120)
fmt.Println(j >> 1) // 00000110(6)
}
package main
import "fmt"
func main() {
x := 2
if (x & 0x01) != 0 {
fmt.Println("最低位为 1")
} else {
fmt.Println("最低位为 0") // 最低位为 0
}
}
package main
import "fmt"
func main() {
x := 4 // 0000 0000 0000 0000 0000 0000 0000 0100
x |= 0x02 // 将第二位置为 1
fmt.Println(x) // 0000 0000 0000 0000 0000 0000 0000 0110
}
package main
import "fmt"
func main() {
x := 7 // 0000 0000 0000 0000 0000 0000 0000 0111
x &^= 0x04 // 清除第三位
fmt.Println(x) // 0000 0000 0000 0000 0000 0000 0000 0011
}
package main
import "fmt"
func main() {
x, y := 3, 5
x ^= y
y ^= x
x ^= y
fmt.Println(x, y) // 5 3
}
package main
import "fmt"
func main() {
x := 3
x <<= 3 // x = x * 8
fmt.Println(x) // 24
x >>= 2 // x = x / 4
fmt.Println(x) // 6
}
操作数类型:位运算符只能用于整数类型(如 int
、uint
、int32
、uint64
等)。
移位操作:
左移和右移的位数必须是非负整数。
如果移位位数超过操作数的位数,结果为 0
。
符号位扩展:
golang
语言会进行符号位扩展(即保留符号位),这意味着如果最高位(符号位)是 1
(表示负数),右移后左侧空出的位会被填充为 1
;如果最高位是 0
(表示正数),则填充为 0
。var a int8 = -8 // 二进制表示为 1111 1000(补码形式)
result := a >> 1 // 结果为 1111 1100,即 -4
0
填充左侧空出的位。var b uint8 = 8 // 二进制表示为 0000 1000
result := b >> 1 // 结果为 0000 0100,即 4
在 golang
语言中,赋值运算符分为两大部分:基本赋值运算符、赋值复合运算符。
最简单的赋值运算符是 =
,用于将右侧的值赋给左侧的变量。
基本赋值运算符 | 含义 |
---|---|
= |
基本赋值运算符 |
var a int
a = 10 // 将 10 赋值给变量 a
复合赋值运算符结合了赋值操作和算术运算符或者位运算符,用于在赋值的同时完成运算。
复合赋值运算符 | 含义 |
---|---|
+= |
加法赋值 |
-= |
减法赋值 |
*= |
乘法赋值 |
/= |
除法赋值 |
%= |
求余赋值 |
<<= |
左移赋值 |
>>= |
右移赋值 |
&= |
位与赋值 |
^= |
按位异或赋值 |
|= |
按位或赋值 |
package main
import "fmt"
func main() {
i, j := 60, 13
var z int
z = i
fmt.Println(i, j, z) // 60 13 60
z += i
fmt.Println(i, j, z) // 60 13 120
z -= j
fmt.Println(i, j, z) // 60 13 107
z *= 2
fmt.Println(i, j, z) // 60 13 214
z /= 2
fmt.Println(i, j, z) // 60 13 107
i %= 59
fmt.Println(i, j, z) // 1 13 107
j <<= i
fmt.Println(i, j, z) // 1 26 107
j >>= i
fmt.Println(i, j, z) // 1 13 107
}
在 golang
语言,指针是一种基本的数据类型,用于存储变量的内存地址。
指针运算符主要包括两个:&
(取地址)和 *
(指针解引用)。这两个运算符是操作指针的核心工具。
关于指针更多的内容,请关注《
Golang
指针》章节,本小结只进行指针运算符的总结。
指针运算符 | 含义 |
---|---|
& |
取地址 |
* |
指针解引用 |
package main
import "fmt"
func main() {
i := 10
fmt.Println(i) // 10
j := &i
fmt.Println(j) // 0xc000046730
fmt.Printf("%T\n", j) // *int
fmt.Println(*j) // 10
*j = 11
fmt.Println(*j) // 11
fmt.Println(i) // 11
}
nil
):表示指针不指向任何有效的内存地址。尝试解引用空指针会导致运行时错误。nil
或指向某个变量的地址,否则会引发错误。在 golang
语言中,运算符的优先级决定了表达式中运算符的执行顺序。
优先级高的运算符会先于优先级低的运算符进行计算。如果运算符的优先级相同,则根据结合性(从左到右或从右到左)来决定计算顺序。
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () |
括号(分组) | 从左到右 |
2 | [] |
数组索引、切片索引 | 从左到右 |
. |
结构体字段访问、方法调用 | 从左到右 | |
3 | * / % << >> & &^ |
乘法、除法、取模、位移、按位与等 | 从左到右 |
4 | + - | ^ |
加法、减法、按位或、按位异或 | 从左到右 |
5 | == != < <= > >= |
比较运算符 | 从左到右 |
6 | && |
逻辑与 | 从左到右 |
7 | || |
逻辑或 | 从左到右 |
8 | = += -= *= /= %= 等 |
赋值运算符 | 从右到左 |
撒花!
如果本文对你有帮助,就点关注或者留个
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。