go 运算符是一种特殊的符号。通常用于数据运算、比较、赋值等场景。
一、运算符包括
- 算术运算符:+、-、*、/、%、++、--
- 关系运算符:==、!=、>、<、>=、<=
- 逻辑运算符:&&、||、!
- 位运算符:&、|、^、<<、>>、&^
- 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
- 其他运算符:&(取地址)、*(指针解引用)、<-(通道操作)、...(变参函数)
二、算数运算符
- 除法运算符(/)在 Go 中有两种行为:当两个操作数都是整数时,结果也是整数,且会向零取整;当至少有一个操作数是浮点数时,结果是浮点数。
- 自增(++)和自减(--)运算符只能作为独立的语句使用,不能用于表达式中。
- 自增、自减只能放在变量名的后面,例如:n++ ,但不能写成 ++n
- 取模 a%b 本质为 a-a/b*b
package main
import "fmt"
func main() {
// 整数除法、小数除法
var n int = 10
var res = n /4 // 结果为2
var res2 = 10.0 / 4 // 结果为2.5
fmt.Println(res, res2)// 2 2.5
// 自增、自减
var m int = 5
m++ // m 变为 6
m-- // m 变回 5
// ++m // 错误,不能写成 ++m
// --m // 错误,不能写成 --m
// 自增和自减只能独立使用,不能用于表达式中
// m = m-- // 错误,不能在表达式中使用自增和自减
// m = m++2 // 错误,不能在表达式中使用自增和自减
// var x = m++ + 2 // 错误,不能在表达式中使用自增和自减
// if m++ > 5 { // 错误,不能在条件表达式中使用自增和自减
// fmt.Println("m is greater than 5")
// }
// 取模的本质
fmt.Println(10 % 3) // 结果为 1 10-(10/3)*3 = 10-(3)*3=10-9=1
fmt.Println(-10 % 3) // 结果为 -1 -10-(-10/3)*3 = -10-(-3)*3 = -10+9 = -1
fmt.Println(10 % -3) // 结果为 1 10-(10/(-3))*(-3) = 10-(-3)*(-3) = 10-9=1
fmt.Println(-10 % -3) // 结果为 -1 -10-(-10/(-3))*(-3) = -10-(3)*(-3) = -10+9=-1
}
三、关系运算符
Go 语言中的关系运算符用于比较两个值,并返回一个布尔值(true 或 false),通常用于 if 结构或者循环结构的条件中
package main
import "fmt"
func main() {
var a int = 10
var b int = 11
fmt.Println(a == b) // false
fmt.Println(a != b) // true
fmt.Println(a > b) // false
fmt.Println(a < b) // true
fmt.Println(a >= b) // false
fmt.Println(a <= b) // true
}
四、逻辑运算符
Go 语言中的逻辑运算符用于连接多个条件表达式,并返回一个布尔值(true 或 false)
- && 也叫短路与,只要第一个条件为 false,整个表达式就为 false,后面的条件将不再被计算。
- || 也叫短路或,只要第一个条件为 true,整个表达式就为 true,后面的条件将不再被计算。
package main
import "fmt"
func test() bool {
fmt.Println("test function called")
return true
}
func main() {
var a int = 10
var b int = 20
fmt.Println(a > 5 && b > 15) // true
fmt.Println(a > 5 || b < 15) // true
fmt.Println(!(a > 5)) // false
// 短路与: test()函数不会被调用,因为a < 5 已经为 false
if a < 5 && test() {
fmt.Println("条件满足")
}
// 短路或:test()函数不会被调用,因为 a > 5 已经为 true
if a > 5 || test() {
fmt.Println("条件满足")
}
}
五、赋值运算符
Go 语言中的赋值运算符用于将一个值赋给一个变量,或者在原有的基础上进行运算后再赋值
- 运算顺序是从右往左
- 赋值运算的左边只能是变量,右边可以是一个表达式、变量、常量等
package main
import "fmt"
func main() {
var a int = 10
a += 5 // a 变为 15
a -= 3 // a 变为 12
a *= 2 // a 变为 24
a /= 4 // a 变为 6
a %= 4 // a 变为 2
a <<= 1 // a 变为 4 (左移一位,相当于乘以2)
a >>= 1 // a 变为 2 (右移一位,相当于除以2)
a &= 1 // a 变为 0 (按位与运算)
a |= 2 // a 变为 2 (按位或运算)
a ^= 3 // a 变为 1 (按位异或运算)
// 交换两个变量值,不使用中间变量
var m int = 1
var n int = 2
m = m + n // m 变为 3
n = m - n // n 变为 1
m = m - n // m 变为 2
// 可以简写为下面
// m, n = n, m // m 变为 2,n 变为 1
}
六、位运算符
七、其他运算符
八、注意
- go 不支持三元运算符
九、运算符的优先级
Go 语言中的运算符优先级决定了在一个表达式中多个运算符出现时,哪个运算符先被计算。以下是 Go 语言中常见的运算符按照优先级从高到低的顺序排列:
- 括号运算符:()、[]、{}、.、->(函数调用、数组索引、结构体字段访问等)
- 一元运算符:+、-、!、^、&(取地址)、*(指针解引用)、<-(通道操作)
- 算术运算符:*、/、%、+、-
- 位运算符:<<、>>、&、|、^、&^
- 关系运算符:==、!=、>、<、>=、<=
- 逻辑运算符:&&、||
- 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
- 其他运算符:...(变参函数)