欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 【六】Golang 运算符

【六】Golang 运算符

2025/5/12 23:49:40 来源:https://blog.csdn.net/m0_46287918/article/details/145621287  浏览:    关键词:【六】Golang 运算符

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

文章目录

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

运算符

golang 中支持运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、指针运算符。

算术运算符

golang 中,算术运算符用于执行基本的数学运算,包括加法、减法、乘法、除法和取模等。如下表所示:

算术运算符含义
+相加
-相减
*相乘
/相除
%求余
++自增
--自减
package mainimport "fmt"func main() {i, j := 10, 20fmt.Println(i + j)    // 30fmt.Println(i - j)    // -10fmt.Println(i * j)    // 200fmt.Println(i / j)    // 0fmt.Println(i%2, j%2) //	0, 0i++fmt.Println(i) // 11j++fmt.Println(j) // 21
}

注意事项

  • 除法运算
    • 如果操作数都是整数(int 类型),结果也是整数。例如,10 / 3 的结果是 3
    • 如果操作数中至少有一个是浮点数(float32float64),结果是浮点数。例如,10.0 / 3 的结果是 3.3333333333333335
  • 取模运算
    • 取模运算符 % 只能用于整数类型。如果需要对浮点数进行类似操作,需要手动实现。
  • 自增和自减运算符
    • ++-- 是后缀运算符(golang 不存在前缀运算符),表示在表达式计算完成后对变量进行加 1 或减 1 操作。

关系运算符

golang 中,关系运算符用于比较两个操作数之间的关系,返回布尔值(truefalse)。

关系运算符含义
==等于
!=不等于
>小于
<大于
>=大于等于
<=小于等于
package mainimport "fmt"func main() {i, j := 10, 20fmt.Println(i == j) // falsefmt.Println(i != j) // truefmt.Println(i > j)  // falsefmt.Println(i < j)  // truefmt.Println(i >= j) // falsefmt.Println(i <= j) // true
}

逻辑运算符

golang 中,逻辑运算符用于对布尔值进行逻辑操作,通常用于组合或修改条件表达式。

逻辑运算符含义
&&逻辑与(AND
||逻辑或(OR
!逻辑非(NOT
package mainimport "fmt"func main() {i, j := true, falsefmt.Println(i && j)    // falsefmt.Println(i || j)    // truefmt.Println(!i)        // falsefmt.Println(!j)        // truefmt.Println(!(i && j)) // truefmt.Println(!(i || j)) // false
}

注意事项

  • 短路行为:在使用 &&|| 时,golang 会执行短路逻辑:
    • 对于 a && b,如果 afalse,则不会计算 b,直接返回 false
    • 对于 a || b,如果 atrue,则不会计算 b,直接返回 true
  • 操作数必须是布尔类型:逻辑运算符只能用于布尔值(bool 类型),不能用于其他类型(如整数或字符串)。

位运算符

golang 中,位运算符用于对整数的二进制位进行操作。这些运算符可以直接操作整数的每一位,常用于底层编程、性能优化或处理特定的算法问题。

位运算符含义解释
&位与(AND当两个操作数对应位都为1时,结果位才为1
|位或(OR当两个操作数中有一个对应位为1,结果位就为1
^位异或(XOR两个操作数的对应位不相同时,结果位为1
<<左移运算符将操作数的二进制表示向左移动指定的位数
>>右移运算符将操作数的二进制表示向右移动指定的位数
package mainimport "fmt"func main() {// i的二进制00111100// j的二进制00001101i, j := 60, 13k := 1fmt.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 mainimport "fmt"func main() {x := 2if (x & 0x01) != 0 {fmt.Println("最低位为 1")} else {fmt.Println("最低位为 0") // 最低位为 0}
}
设置特定位为 1
package mainimport "fmt"func main() {x := 4 // 0000 0000 0000 0000 0000 0000 0000 0100x |= 0x02 // 将第二位置为 1fmt.Println(x) // 0000 0000 0000 0000 0000 0000 0000 0110
}
清除特定位
package mainimport "fmt"func main() {x := 7 // 0000 0000 0000 0000 0000 0000 0000 0111x &^= 0x04 // 清除第三位fmt.Println(x) // 0000 0000 0000 0000 0000 0000 0000 0011
}
交换变量值
package mainimport "fmt"func main() {x, y := 3, 5x ^= yy ^= xx ^= yfmt.Println(x, y) // 5 3
}
快速乘除
package mainimport "fmt"func main() {x := 3x <<= 3        // x = x * 8fmt.Println(x) // 24x >>= 2        // x = x / 4fmt.Println(x) // 6
}

注意事项

  • 操作数类型:位运算符只能用于整数类型(如 intuintint32uint64 等)。

  • 移位操作

    • 左移和右移的位数必须是非负整数。

    • 如果移位位数超过操作数的位数,结果为 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 mainimport "fmt"func main() {i, j := 60, 13var z intz = ifmt.Println(i, j, z) // 60 13 60z += ifmt.Println(i, j, z) // 60 13 120z -= jfmt.Println(i, j, z) // 60 13 107z *= 2fmt.Println(i, j, z) // 60 13 214z /= 2fmt.Println(i, j, z) // 60 13 107i %= 59fmt.Println(i, j, z) // 1 13 107j <<= ifmt.Println(i, j, z) // 1 26 107j >>= ifmt.Println(i, j, z) // 1 13 107
}

指针运算符

golang 语言,指针是一种基本的数据类型,用于存储变量的内存地址。

指针运算符主要包括两个:&(取地址)和 *(指针解引用)。这两个运算符是操作指针的核心工具。

关于指针更多的内容,请关注《Golang 指针》章节,本小结只进行指针运算符的总结。

指针运算符含义
&取地址
*指针解引用
package mainimport "fmt"func main() {i := 10fmt.Println(i) // 10j := &ifmt.Println(j)        // 0xc000046730fmt.Printf("%T\n", j) // *intfmt.Println(*j)       // 10*j = 11fmt.Println(*j) // 11fmt.Println(i)  // 11
}

注意事项

  • 空指针(nil:表示指针不指向任何有效的内存地址。尝试解引用空指针会导致运行时错误。
  • 指针的初始化:指针变量在声明时必须初始化为 nil 或指向某个变量的地址,否则会引发错误。
  • 指针与切片、结构体:指针常用于操作切片和结构体,以避免不必要的值拷贝,提高性能。

优先级

golang 语言中,运算符的优先级决定了表达式中运算符的执行顺序。

优先级高的运算符会先于优先级低的运算符进行计算。如果运算符的优先级相同,则根据结合性(从左到右或从右到左)来决定计算顺序。

优先级运算符描述结合性
1()括号(分组)从左到右
2[]数组索引、切片索引从左到右
.结构体字段访问、方法调用从左到右
3* / % << >> & &^乘法、除法、取模、位移、按位与等从左到右
4+ - | ^加法、减法、按位或、按位异或从左到右
5== != < <= > >=比较运算符从左到右
6&&逻辑与从左到右
7||逻辑或从左到右
8= += -= *= /= %=赋值运算符从右到左

🌺🌺🌺撒花!

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

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词