主页 > 人工智能  > 

【六】Golang运算符

【六】Golang运算符

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录 运算符算术运算符注意事项 关系运算符逻辑运算符注意事项 位运算符常见操作检查特定位是否为 1(检查整数的奇偶性)设置特定位为 1清除特定位交换变量值快速乘除 注意事项 赋值运算符基本赋值运算符复合赋值运算符 指针运算符注意事项 优先级

运算符

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) } 常见操作 检查特定位是否为 1(检查整数的奇偶性) package main import "fmt" func main() { x := 2 if (x & 0x01) != 0 { fmt.Println("最低位为 1") } else { fmt.Println("最低位为 0") // 最低位为 0 } } 设置特定位为 1 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= += -= *= /= %= 等赋值运算符从右到左

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍 如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

标签:

【六】Golang运算符由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【六】Golang运算符