1.golang运算符
1.1Go语言内置运算符
算术运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 后自增,没有前自增 | a=0; a++ | a=1 |
-- | 后自减,没有前自减 | a=2; a-- | a=1 |
注意,
++
(自增)和--
(自减)在Go语言中是单独语句,并不是运算符
go
package main
import "fmt"
func main() {
a := 100
b := 20
x := a + b
fmt.Printf("x: %v\n", x)
//这里x = a - b 为啥没有冒号,由于上面已有声明,下面直接赋值
x = a - b
fmt.Printf("x: %v\n", x)
x = a * b
fmt.Printf("x: %v\n", x)
x = a / b
fmt.Printf("x: %v\n", x)
//或者以下方式书写
fmt.Printf("x==: %v\n", a/b)
y := 100
y++
fmt.Printf("y: %v\n", y)
}
package main
import "fmt"
func main() {
a := 100
b := 20
x := a + b
fmt.Printf("x: %v\n", x)
//这里x = a - b 为啥没有冒号,由于上面已有声明,下面直接赋值
x = a - b
fmt.Printf("x: %v\n", x)
x = a * b
fmt.Printf("x: %v\n", x)
x = a / b
fmt.Printf("x: %v\n", x)
//或者以下方式书写
fmt.Printf("x==: %v\n", a/b)
y := 100
y++
fmt.Printf("y: %v\n", y)
}
关系运算符
返回结果,都是bool值
运算符 | 描述 |
---|---|
== | 检查两个值是否相等,如果相等返回true否则返回False |
!= | 检查两个值是否不相等,如果不相等返回true否则返回False |
> | 检查左边值大于右边值,如果是返回true否则返回Fals |
>= | 检查左边值是否大于右边值,如果是返回true否则返回Fals |
< | 检查左边值小于右边值,如果是返回true否则返回Fals |
<= | 检查左边值小于等于右边值,如果是返回true否则返回Fals |
逻辑运算符
运算符 | 描述 |
---|---|
&& | 逻辑AND,与。如果两边的操作都是True,则为True,否则为False |
` | |
! | 逻辑NOT,非,取反。如果条件为True,则为False,否则为True |
go
package main
import "fmt"
func main() {
a := true
b := false
r := a && b
fmt.Printf("r:= %v\n", r)
r = a || b
fmt.Printf("r:= %v\n", r)
fmt.Printf("a:= %v\n", !a)
}
package main
import "fmt"
func main() {
a := true
b := false
r := a && b
fmt.Printf("r:= %v\n", r)
r = a || b
fmt.Printf("r:= %v\n", r)
fmt.Printf("a:= %v\n", !a)
}
位运算符
运算符 | 描述 |
---|---|
& | 参与运算的两数各对应的二进位相与(两位均为1才为1) |
| | 参与运算的两数各对应的二进位相或(两位有一个为1就为1) |
^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1.(两位不一样则为1) |
<< | 左移n位就是乘以2的n次方。"a<<b"是把a的各二进制位全部左移b位,高位丢弃,低位补0. |
>> | 右移n位就是除以2的n次方。"a>>b"是把a的各二进位全部右移b位 |
go
package main
import "fmt"
func main() {
a := 4 //二进制 0100
b := 8 //二进制 1000
fmt.Printf("b: %b\n", b)
fmt.Printf("(a & b): %v, %b \n", (a & b), (a & b))
fmt.Printf("(a | b): %v ,%b \n", (a | b), (a | b))
fmt.Printf("(a ^ b): %v ,%b\n", (a ^ b), (a ^ b))
fmt.Printf("(a << 2): %v ,%b\n", (a << 2), (a << 2))
fmt.Printf("(b >> 2): %v ,%b\n", (b >> 2), (b >> 2))
}
package main
import "fmt"
func main() {
a := 4 //二进制 0100
b := 8 //二进制 1000
fmt.Printf("b: %b\n", b)
fmt.Printf("(a & b): %v, %b \n", (a & b), (a & b))
fmt.Printf("(a | b): %v ,%b \n", (a | b), (a | b))
fmt.Printf("(a ^ b): %v ,%b\n", (a ^ b), (a ^ b))
fmt.Printf("(a << 2): %v ,%b\n", (a << 2), (a << 2))
fmt.Printf("(b >> 2): %v ,%b\n", (b >> 2), (b >> 2))
}
赋值运算符
运算符 | 描述 |
---|---|
= | 简单赋值,将一个表达式的值赋给一个左值 |
+= | 相加后在赋值 |
-= | 相减后在赋值 |
*= | 相乘后在赋值 |
/= | 相除后在赋值 |
%= | 求余后在赋值 |
<<= | 左移后在赋值 |
>>= | 右移后在赋值 |
&= | 按位与后在赋值 |
|= | 按位或后在赋值 |
^= | 按位异后在赋值 |
go
package main
import "fmt"
func main() {
a := 100
fmt.Printf("a=: %v\n", a)
a += 1 //a = a + 1
fmt.Printf("a=: %v\n", a)
a -= 1
fmt.Printf("a=: %v\n", a)
}
package main
import "fmt"
func main() {
a := 100
fmt.Printf("a=: %v\n", a)
a += 1 //a = a + 1
fmt.Printf("a=: %v\n", a)
a -= 1
fmt.Printf("a=: %v\n", a)
}
其他运算符
下表列出了Go语言的其他运算符。
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a;将给出变量的实际地址。 |
* | 指针变量。 | *a;是一个指针变量 |
go
package main
import "fmt"
func main(){
var a int =4
var b int32
var c float32
var ptr *int
/*运算符实例*/
fmt.Printf("第1 行-a 变量类型为=%T\n",a)
fmt.Printf("第2行-b变量类型为=%T\n",b)
fmt.Printf("第3行-c变量类型为=%T\n",c)
/*&和运算符实例*/
ptr=&a /*'ptr'包含了‘a'变量的地址*/
fmt.Printf("a 的值为%d\n",a)
fmt.Printf("ptr 的值为%p\n",ptr)
fmt.Printf("*ptr 为 %d\n",*ptr)
}
package main
import "fmt"
func main(){
var a int =4
var b int32
var c float32
var ptr *int
/*运算符实例*/
fmt.Printf("第1 行-a 变量类型为=%T\n",a)
fmt.Printf("第2行-b变量类型为=%T\n",b)
fmt.Printf("第3行-c变量类型为=%T\n",c)
/*&和运算符实例*/
ptr=&a /*'ptr'包含了‘a'变量的地址*/
fmt.Printf("a 的值为%d\n",a)
fmt.Printf("ptr 的值为%p\n",ptr)
fmt.Printf("*ptr 为 %d\n",*ptr)
}
运算符优先级
在 go 语言中,一元运算符拥有最高的优先级,二元运算符的运算方向均是从左至右。
下表列出了所有运算符以及他们的优先级,由上至下代表由高到低:
优先级 | 运算符 |
---|---|
7 | ^ , ! |
6 | * , / , %, <<, >>, &, &^ |
5 | +, -, ^, | |
4 | ==, !=, <, <=, >, >= |
3 | <- |
2 | && |
1 | || |