目录
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
其他运算符
运算符优先级
代码示例
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
原文:Go的运算符解密:探索计算的奥秘
本篇文章我将总结介绍下Go语言中关于运算符的知识点。
Go语言中的运算符用于执行各种数学和逻辑操作。本文我将详细介绍Go语言中常用的运算符,包括算术运算符、赋值运算符、比较(关系)运算符、逻辑运算符、位运算符和其他运算符。
算术运算符
Go语言中的算术运算符用于执行基本的数学运算,如加法、减法、乘法和除法。
-
加法运算符(+):用于将两个操作数相加,如a + b。
-
减法运算符(-):用于将第一个操作数减去第二个操作数,如a - b。
-
乘法运算符(*):用于将两个操作数相乘,如a * b。
-
除法运算符(/):用于将第一个操作数除以第二个操作数,如a / b。
-
取余运算符(%):用于获取两个操作数相除的余数,如a % b。
赋值运算符
赋值运算符用于将一个值赋给变量。
-
简单赋值运算符(=):将右边的值赋给左边的变量,如a = b,简单的赋值运算符,将一个表达式的值赋给一个左值。
-
加法赋值运算符(+=):将右边的值与左边的变量相加,并将结果赋给左边的变量(相加后再赋值),如a += b。
-
减法赋值运算符(-=):将右边的值与左边的变量相减,并将结果赋给左边的变量(相减后再赋值),如a -= b。
-
乘法赋值运算符(*=):将右边的值与左边的变量相乘,并将结果赋给左边的变量(相乘后再赋值),如a *= b。
-
除法赋值运算符(/=):将左边的变量除以右边的值,并将结果赋给左边的变量(相除后再赋值),如a /= b。
-
取余赋值运算符(%=):将左边的变量除以右边的值的余数,并将结果赋给左边的变量(求余后再赋值),如a %= b。
-
<<=:左移后赋值。
-
>>=:右移后赋值。
-
&=:按位与后赋值。
-
l=:按位或后赋值。
-
^=:按位异或后赋值。
比较运算符
比较运算符用于比较两个值的大小或相等性。
-
相等运算符(==):判断两个值是否相等,如a == b,如果相等返回 True 否则返回 False。
-
不等运算符(!=):判断两个值是否不相等,如a != b,如果不相等返回 True 否则返回 False。
-
大于运算符(>):判断第一个值是否大于第二个值,如a > b,如果是返回 True 否则返回 False。
-
小于运算符(<):判断第一个值是否小于第二个值,如a < b,如果是返回 True 否则返回 False。
-
大于等于运算符(>=):判断第一个值是否大于等于第二个值,如a >= b,如果是返回 True 否则返回 False。
-
小于等于运算符(<=):判断第一个值是否小于等于第二个值,如a <= b,如果是返回 True 否则返回 False。
逻辑运算符
逻辑运算符用于对布尔值进行逻辑运算。
-
逻辑与运算符(&&):逻辑 AND 运算符。判断两个布尔值是否都为真,如果两边的操作数都是 True,则为 True,否则为 False。如a && b。
-
逻辑或运算符(||):逻辑 OR 运算符。判断两个布尔值是否至少有一个为真,如果两边的操作数有一个 True,则为 True,否则为False。如a || b。
-
逻辑非运算符(!):逻辑 NOT 运算符。对布尔值进行取反操作,如果条件为 True,则为 False,否则为True。如!a。
位运算符
位运算符对整数在内存中的二进制位进行操作。
-
按位与运算符(&):对两个整数的每个位进行与操作,如a & b,参与运算的两数各对应的二进位相与。(两位均为1才为1)。
-
按位或运算符(|):对两个整数的每个位进行或操作,如a | b,参与运算的两数各对应的二进位相或。(两位有一个为1就为1)。
-
按位异或运算符(^):对两个整数的每个位进行异或操作,如a ^ b,参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(两位不一样则为1)。
-
左移运算符(<<):将一个整数的每个位向左移动指定的位数,如a << b,左移n位就是乘以2的n次方。“a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。
-
右移运算符(>>):将一个整数的每个位向右移动指定的位数,如a >> b,右移n位就是除以2的n次方。“a>>b”是把a的各二进位全部右移b位。
其他运算符
除了上述常用的运算符,Go语言还提供了其他一些特殊的运算符。
-
地址运算符(&):用于获取变量的内存地址,如&a。
-
指针运算符(*):用于声明指针变量或通过指针间接访问变量,如*ptr。
-
自增运算符(++):将变量的值增加1,如a++。
-
自减运算符(--):将变量的值减少1,如a--。
注意:
++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。
Go不支持这种三目运算符,Python中支持,条件运算符(?:):根据条件选择不同的值,如a > b ? a : b。
运算符优先级
以下是Go语言中运算符的优先级顺序(从高到低):
1. 括号:()
2. 单目运算符:+(正号)、-(负号)、!(逻辑非)、^(按位取反)
3. 乘法和除法运算符:*(乘法)、/(除法)、%(取模)
4. 加法和减法运算符:+(加法)、-(减法)
5. 位运算符:<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)
6. 关系运算符:==(等于)、!=(不等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)
7. 逻辑运算符:&&(逻辑与)、||(逻辑或)
8. 位清空运算符:&^(按位清零)
9. 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=、&^=
10. 逗号运算符:,
需要注意的是,运算符的优先级决定了表达式中运算符的结合性和计算顺序。如果表达式中有多个运算符,优先级高的运算符会先进行计算。如果优先级相同的运算符出现在同一表达式中,根据结合性从左到右或从右到左进行计算。
代码示例
package main
import "fmt"
/*
Go没有三元操作符
!和<-可以用于一元和二元操作符来使用
<-接收操作符
7个算术操作符只能作用于整数:%、&、|、^、&^、<<、>>
= 用于将一个值赋给一个已被声明的变量或常量
:= 用于在声明一个变量的同时对这个变量进行赋值,且只能在函数体内使用
++、--是语句不是表达式
*p-- 等同于 (*p)--
*/
func operator01() {
//+ 连接符
//只会创建并使用一个新的字符串值来保存操作结果,而不会改变任何操作数的值
fmt.Println("Hello" + "GoLang" + "!")
var str1 string = "Numbers:"
fmt.Println(str1)
fmt.Println(str1 + string(111)) //Numbers:o Python中OK
// fmt.Println(str1+111) error 字符串和数字不能使用连接符
//取出变量str1的地址
fmt.Println(&str1)
//根据地址取出值
fmt.Println(*&str1)
// <- 接收操作符
// 用于通道类型的值
/*
从一个通道类型的空值nil 接收值的表达式将会永远被阻塞
从一个已被关闭的通道类型值接收值会永远成功并立即返回一个其元素类型的零值
一个由接收操作符和通道类型的操作数所组成的表达式可以直接被用于变量赋值或初始化
*/
// <- ch
// v1 := <-ch
// v2 = <-ch
// v, ok = <-ch
// v, ok := <-ch
// 通过同时对两个变量进行赋值或初始化 第二个变量将会是一个bool类型的值 表示接受操作的成功与否,可以通过它来判断一个通道是否已被关闭,如果值为false 就表示通道已关闭
}
func operator02() {
num1 := 5
num2 := 9
//num1 > num2 ? num1 : num2 // Go不支持这种写法
fmt.Println(num1 + num2)
fmt.Println(num1 - num2)
fmt.Println(num1 * num2)
fmt.Println(num1 / num2)
fmt.Println(num1 % num2)
num2 <<= 2
fmt.Println(num2)
num2 >>= 2
fmt.Println(num2)
num2 &= 2
fmt.Println(num2)
num2 |= 2
fmt.Println(num2)
num2 ^= 2
fmt.Println(num2)
/* outputs
14
-4
45
0
5
36
9
0
2
0
*/
}
func operator03() {
//关系运算符
num1 := 11
num2 := 11
num3 := 0
isEqual := num1 == num2
isNotEqual := num1 != num2
isLess := num1 < num3
isLessOrEqual := num1 <= num2
fmt.Println(isEqual) // true
fmt.Println(isNotEqual) // true
fmt.Println(isLess) // true
fmt.Println(isLessOrEqual) // true
// 逻辑运算符
addr := &num1 // 取变量num1的地址
result := *addr // 解引用变量addr,得到变量num1的值
fmt.Println(addr, result) // 0xc00001c098 11
typeOfAddr := reflect.TypeOf(addr)
typeOfResult := reflect.TypeOf(result)
fmt.Println(typeOfAddr, typeOfResult) // *int int
}
以上是Go语言中常用的运算符及其用法。运算符是编程语言中非常基础和重要的概念,熟练掌握运算符的使用可以帮助我们进行各种数学和逻辑操作。
更多精彩,关注我公号,一起学习、成长
推荐阅读:
-
开源项目 | 17款云原生安全相关的扫描和平台类开源工具
-
Go语言常量解密:恒定不变的值(const与iota)(附代码示例)
深入了解Go语言的数据类型 -
使用strconv进行Go的 int、float、string类型相互转换:灵活转换数据类型
-
Go语言变量的生命周期与作用域
-
Go中字符串的遍历技巧:轻松操作文本
-
Go语言字符串操作大揭秘:高效处理文本
-
Go的流程控制(if、for、switch、goto)全面解析与刨坑
-
Go的多端开发环境与编译器的搭建详解(图文)
-
Go语言的高级特性,发展趋势,以及推荐最热门的开源项目