作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.运算符概述
运算符用于在程序运行时执行数学或逻辑运算。
Go语言内置的运算符有:算术运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,指针运算符等。
二.算数运算符
1.常见的算数运算符
运算符 |
描述 |
+ |
相加 |
- |
相减 |
* |
相乘 |
/ |
相除 |
% |
求余 |
++ |
自增+1 |
-- |
自减-1 |
温馨提示:
1.在go语言中,++和--操作非常简单,只能单独使用,不能参与运算中去;
2.在go语言中,++和--只能在变量的后面,不能写在变量的前面;
2.参考案例
package main
import (
"fmt"
)
func main() {
/*
加法运算应用场景:
- 正数
- 相加操作
- 字符串拼接
减法运算应用场景:
计算2个数字的差值。
*/
var (
// 加法表示正数
a int = +10
// 加法可以用于相加操作
b int = 10 + 5
// 加法可以用于字符串拼接
c string = "hello" + "world"
// 减法计算两个数据的差值
x = 10 - 5
)
fmt.Printf("a = [%d], b = [%d], c = [%s], x = [%d]\n", a, b, c, x)
/*
乘号应用场景:
多用于数值型的乘法计算。
除号应用场景:
多用于数值型的除法计算。
*/
var (
// 两个int类型数据运算,结果一定为整数类型
d int = 10 / 3
// 浮点类型参与运算,结果为浮点类型
f float64 = 10.0 / 3
y float64 = 10 * 2.5
)
fmt.Printf("d = [%d],f = [%.10f], y = [%.1f]\n", d, f, y)
/*
取模应用场景:
多用于计算余数。
*/
var (
g int = 10 % 3
h float64 = -10 % -4
)
fmt.Printf("g = [%d],h = [%.2f]\n", g, h)
/*
++:
自增操作。
--:
自减操作。
温馨提示:
1.在go语言中,++和--操作非常简单,只能单独使用,不能参与运算中去;
2.在go语言中,++和--只能在变量的后面,不能写在变量的前面;
*/
var (
i int = 10
j = 20
)
i++
j--
// 下面2种写法不被允许,编译会报错
// ++i
// --j
fmt.Printf("i = [%d], j = [%d]\n", i, j)
}
三.赋值运算符
1.常见的赋值运算符
运算符 |
描述 |
\= |
简单的赋值运算符,将一个表达式的值赋给一个左值 |
+= |
相加后再赋值 |
-= |
相减后再赋值 |
*= |
相乘后再赋值 |
/= |
相除后再赋值 |
%= |
求余后再赋值 |
<<= |
左移后赋值 |
>>= |
右移后赋值 |
&= |
按位与后赋值 |
|= |
按位或后赋值 |
^= |
按位异或后赋值 |
2.参考案例
package main
import "fmt"
func main() {
var (
a int = 10
// 右侧的值运算清楚后,再复制给=的左侧
b int = (10+20)%3 + 3 - 8
c int = 10
x = 22
y = 33
)
// 等价于 c = c + 20
c += 20
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
fmt.Printf("交换前: x = %d, y = %d\n", x, y)
// 交换x和y的值
x, y = y, x
fmt.Printf("交换后: x = %d, y = %d\n", x, y)
}
四.关系运算符
1.常见的关系运算符
运算符 |
描述 |
\== |
检查两个值是否相等,如果相等返回 True 否则返回 False。 |
!= |
检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
> |
检查左边值是否大于右边值,如果是返回 True 否则返回 False。 |
>= |
检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
< |
检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
<= |
检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
2.参考案例
package main
import (
"fmt"
)
func main() {
x := 10
y := 5
fmt.Println(x == y)
fmt.Println(x != y)
fmt.Println(x > y)
fmt.Println(x >= y)
fmt.Println(x < y)
fmt.Println(x <= y)
}
五.逻辑运算符
1.常见的逻辑运算符
运算符 |
描述 |
&& |
逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。 |
|| |
逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。 |
! |
逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。 |
2.参考案例
package main
import (
"fmt"
)
func main() {
x := true
y := false
/*
与逻辑: (也称为"短路与")
两个条件都成才为真,只要有一侧是false,结果一定为false。
所谓的"短路与",只要第一个数值/表达式结果是false,那么后面的表达式就不用运算了,直接结果就是false。
*/
fmt.Println(y && x)
/*
或逻辑: (也称为"短路或")
两个条件有任意一个成立就为真,只要有一侧是true,结果一定为true。
所谓的"短路或",只要第一个数值/表达式结果是true,那么后面的表达式就不用运算了,直接结果就是true。
*/
fmt.Println(x || y)
/*
非逻辑:
取反操作,即原来为真取非就为假,原来为假取非后就为真。
*/
fmt.Println(!x)
fmt.Println(!y)
}
六.位运算符
1.常见的位运算符
运算符 |
描述 |
& |
参与位与运算的两个数对应的二进制位都为1时才为真 |
| |
参与位或运算的两个数对应的二进制位有任意一个为1则为真 |
^ |
参与位异或运算(^)的两个数对应的二进制位不一样则为真 |
<< |
左移n位就是乘以2的n次方。 "a<<b"是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
>> |
右移n位就是除以2的n次方。 "a>>b"是把a的各二进位全部右移b位,低位丢弃,高位补0。 |
温馨提示:
位运算符对整数在内存中的二进制位进行操作。
2.参考案例
package main
import (
"fmt"
)
func main() {
x := 11
y := 7
fmt.Printf("%d ---> : %b\n", x, x)
fmt.Printf("%.2d ---> : %.4b\n", y, y)
// 参与位与运算(&)的两个数对应的二进制位都为1时才为真
fmt.Printf("%d & %d ---> %d\n", x, y, x&y)
// 参与位或运算(|)的两个数对应的二进制位有任意一个为1则为真
fmt.Printf("%d | %d ---> %d\n", x, y, x|y)
// 参与位异或运算(^)的两个数对应的二进制位不一样则为真
fmt.Printf("%d ^ %d ---> %d\n", x, y, x^y)
// 左移n位就是乘以2的n次方。 "a<<b"是把a的各二进位全部左移b位,高位丢弃,低位补0。
fmt.Printf("%d << 2 ---> %d\n", y, y<<2)
// 右移n位就是除以2的n次方。 "a>>b"是把a的各二进位全部右移b位,低位丢弃,高位补0。
fmt.Printf("%d >> 2 ---> %d\n", x, x>>2)
}
七.指针运算符
1.其他运算符概述
其他运算符我们在指针的章节有介绍过,分别为"&"和"*"。
&:
返回变量的存储地址。
*:
取指针变量对应的数据。
参考链接:
https://www.cnblogs.com/yinzhengjie/p/18286812
2.参考案例
package main
import "fmt"
func main() {
var (
// 定义一个int基础数据类型
a int = 100
// 定义一个*int指针类型数据
b *int = &a
)
fmt.Printf("a对应内存地址为: %v,存储的数据为:%v\n", &a, a)
fmt.Printf("b对应的内存地址为: %v,存储的数据为: %v,指针指向的数据为: %v\n", &b, b, *b)
}
八.运算符的优先级
1.运算符优先级一览表
优先级 |
分类 |
运算符 |
顺序 |
1 |
逗号运算符 |
, |
从左到右 |
2 |
赋值运算符 |
\= 、 +=、 -=、 *= 、 /= 、%=、 >=、 <<=、 &=、 ^= 、 |
从右到左 |
3 |
逻辑或 |
|| |
从左到右 |
4 |
逻辑与 |
&& |
从左到右 |
5 |
按位或 |
| |
从左到右 |
6 |
按位异或 |
^ |
从左到右 |
7 |
按位与 |
& |
从左到右 |
8 |
相等/不等 |
\==、!= |
从左到右 |
9 |
关系运算符 |
<、<=、>、>= |
从左到右 |
10 |
位移运算符 |
<<、>> |
从左到右 |
11 |
加法/减法 |
+、- |
从左到右 |
12 |
乘法/除法/取余 |
*(乘号)、/、% |
从左到右 |
13 |
单目运算符 |
!、*(指针的值)、&(指针的地址)、++、--、+(正号)、-(负号) |
从右到左 |
14 |
后缀运算符 |
()、[]、->、 |
从左到右 |
如上表所示,Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同。
但是记住上面的运算符优先级太费劲了,我们可以记住一句话,为了提高优先级,可以加小括号"()"即可。
2.运算符优先级案例
package main
import "fmt"
func main() {
var (
x int = 100
y = 20
z = 50
)
// 1.很明显,运算符先算的是乘法,再算加法。
result01 := x + y*z
// 2.通过小括号"()"让加法运算先执行,再去执行乘法。
result02 := (x + y) * z
fmt.Printf("result01 = %d\n", result01)
fmt.Printf("result02 = %d\n", result02)
}
九.获取用户输入的两种方式
package main
import "fmt"
func main() {
/*
需求分析:
键盘录入用户的姓名,年龄,分数是否是svip。
实现方式:
方式一: Scanln(推荐)
按行录入,输入数据的时候,类型一定要匹配,因为底层会自动判断类型的。如果未输入,则使用数据的默认值("零值")
方式二: Scanf
从标准输入扫描文本,根据参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。
*/
// 方式一: 基于Scanln实现
var name string
fmt.Println("请输入用户的姓名: ")
fmt.Scanln(&name)
var age int
fmt.Println("请输入用户的年龄: ")
fmt.Scanln(&age)
var score float64
fmt.Println("请输入用户的积分: ")
fmt.Scanln(&score)
var svip bool
fmt.Println("请输入用户是否为SVIP: ")
fmt.Scanln(&svip)
fmt.Printf("用户的姓名为: [%v],年龄: [%v], 积分: [%v], SVIP: [%v]\n", name, age, score, svip)
// 方式二: 基于Scanf实现
// fmt.Println("请输入用户的姓名,年龄,积分,vip;使用空格分隔即可")
// var (
// name string
// age uint8
// score float64
// svip bool
// )
// fmt.Scanf("%s %d %f %t", &name, &age, &score, &svip)
// fmt.Printf("用户的姓名为: [%v],年龄: [%v], 积分: [%v], SVIP: [%v]\n", name, age, score, svip)
}