一、算术运算符
算术运算符有:加(+)、减(-)、乘(*)、除(/)、取余(%)、加加(++)、减减(–)
作用:是对数值类型的变量进行的运算。
示例:
package main
import "fmt"
func main() {
//算术运算符 arithmetic
//加(+)
var n1 int = +10
fmt.Printf("n1 的值为: %d\n", n1) // 10 标识正数
var n2 int = 14 + 7
fmt.Printf("n2的值为:%d\n", n2) // 21 相加
var s1 string = "abc" + "def"
fmt.Printf("s1的值为;%s\n", s1) // abcdef 类型为字符串时,字符串拼接
//减(-)
var n3 int = 10 - 4
fmt.Printf("n3的值为:%d\n", n3)
//乘(*)
var n4 int = 10 * 4
fmt.Printf("n4的值为:%d\n", n4)
//除(/)
var n5 int = 10 / 2 //int类型数据运算,结果一定 为整数类型
fmt.Printf("n5的值为:%d\n", n5)
var n6 float32 = 10.2 / 2 //浮点型运算,结果一定是浮点类型
fmt.Printf("n6的值为:%f\n", n6)
//取余(%) 等价公式:a%b = a - a/b*b
var n7 int = 10 % 3 // 10%3 = 10 - 10/3*3 = 1
var n8 int = -10 % 3 // -1
var n9 int = 10 % -3 // 1
var n10 int = -10 % -3 // -1
fmt.Printf("n7的值为:%d\n", n7)
fmt.Printf("n8的值为:%d\n", n8)
fmt.Printf("n9的值为:%d\n", n9)
fmt.Printf("n10的值为:%d\n", n10)
//加加(++) 自增 加1操作
var n11 int = 10
n11++
fmt.Printf("n11的值为:%d\n", n11) //11
//减减(--) 自减 减1操作
var n12 int = 10
n12--
fmt.Printf("n12的值为:%d\n", n12) //9
//说明:go语言里,++,--操作只能写到变量后面,不能写到变量前面。
//++n12; 这是错误的用法,这根其他语言有区别
}
执行结果:
n1 的值为: 10
n2的值为:21
s1的值为;abcdef
n3的值为:6
n4的值为:40
n5的值为:5
n6的值为:5.100000
n7的值为:1
n8的值为:-1
n9的值为:1
n10的值为:-1
n11的值为:11
n12的值为:9
二、赋值运算符
赋值运算符有:=、+=、-=、*=、/=、%=
定义:将运算后的值,赋给指定变量
示例:
package main
import "fmt"
func main() {
var n1 int = 10
fmt.Println(n1) //10
var n2 int = (10+2)%3 + 3 - 2
fmt.Println(n2) //1
var n3 int = 10
n3 += 20 //加等 等价于:n3 = n3 + 20
fmt.Println(n3) //30
}
运行结果:
10
1
30
三、关系运算符
关系运算符有:==、!=、> 、<、 >=、 <=
关系运算的结果都是布尔类型,即为true或false
经常用在流程的控制中
示例:
package main
import "fmt"
func main() {
fmt.Println(10 == 2) //false
fmt.Println(10 != 2) //true
fmt.Println(10 > 2) //true
fmt.Println(10 < 2) //false
fmt.Println(10 >= 2) //true
fmt.Println(10 <= 2) //false
}
结果:
false
true
true
false
true
false
四、逻辑运算符
逻辑运算符有:&&(逻辑与/短路与) 、||(逻辑或/短路或)、 !(逻辑非)
示例:
package main
import "fmt"
func main() {
// && 逻辑与 :两个值或表达式只要一侧是false,结果一定是false。
//又叫短路与:有一个为false,后面的不参与运算了,结果直接就是false。 提高运算效率
fmt.Println(true && true) //true
fmt.Println(true && false) //false
fmt.Println(false && true) //false
fmt.Println(false && false) //false
// || 逻辑或 : 两个值或表达式只要一侧为true,则结果一定为true
//又叫短路或:只要一侧为true,后面的就不参与运算了,结果直接是true。 提高运算效率
fmt.Println(true || true) //true
fmt.Println(true || false) //true
fmt.Println(false || true) //true
fmt.Println(false || false) //false
// ! 逻辑非:取相反结果
fmt.Println(!true) //false
fmt.Println(!false) //true
}
结果:
true
false
false
false
true
true
true
false
false
true
五、其他运算符
其他运算符有:&(变量存储地址)、*(指针变量对应的数值)
示例:
package main
import "fmt"
func main() {
//定义变量
var age int = 10
fmt.Println("age对应的存储空间的地址为:", &age) //0xc000018098
var ptr *int = &age
fmt.Println(ptr) //0xc000018098
fmt.Println("ptr这个指针指向的具体数值为:", *ptr) //10
}
结果:
age对应的存储空间的地址为: 0xc000018098
0xc000018098
ptr这个指针指向的具体数值为: 10
六、运算符的优先级
go语言有几十种运算符,被分成了十几个级别。优先级级别请看下表:
优先级 | 分类 | 运算符 | 结合性 |
---|---|---|---|
1 | 逗号运算符 | , | 从左到右 |
2 | 赋值运算符 | =、+=、-=、*=、/=、%=、>>= 、<<=、&=、 ^= 、|= | 从右到左 |
3 | 逻辑或 | || | 从左到右 |
4 | 逻辑与 | && | 从左到右 |
5 | 按位或 | | | 从左到右 |
6 | 按位异或 | ^ | 从左到右 |
7 | 按位与 | & | 从左到右 |
8 | 相等、不等 | ==、!= | 从左到右 |
9 | 关系运算符 | < 、<=、 >、 >= | 从左到右 |
10 | 位移运算符 | <<、>> | 从左到右 |
11 | 加法、减法 | +、- | 从左到右 |
12 | 乘法、除法、取余 | *(乘号)、/、% | 从左到右 |
13 | 单目运算符 | !、*(指针)、&、++、–、+(正号)、-(负号) | 从右到左 |
14 | 后缀运算符 | ()、[]、-> | 从左到右 |
七、获取用户终端输入
如果需要接收用户输入的数据,可以使用键盘输入语句来获取。
API:
Scanln类似Scan,但会在换行时才能停止扫描。最后一个条目后必须有换行或者到达结束位置。
func Scanln(1 ...interface{})(n int, err error)
Scanf从标准输入扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。
func Scanf(format string, a ...interface{})(n int, err error)
示例:
package main
import "fmt"
func main() {
//实现功能:键盘录入学生的年龄、姓名、成绩、是否VIP
////方式1 : Scanln
//var age int
//fmt.Println("请输入学生的年龄:")
////传入age地址的目的地:在Scanln函数中,对地址中的值进行改变的时候,实际外面的age被影响了
//fmt.Scanln(&age) //录入数据的时候,类型一定要匹配,因为底层会自动判断类型
//
//var name string
//fmt.Println("请输入学生姓名:")
//fmt.Scanln(&name)
//var score float32
//fmt.Println("请输入学生分数:")
//fmt.Scanln(&score)
//var isVIP bool
//fmt.Println("请输入是否VIP:")
//fmt.Scanln(&isVIP)
//方式2:Scanf
var age2 int
var name2 string
var score2 float32
var isVIP2 bool
fmt.Println("请录入学生的年龄,姓名,成绩,是否VIP,使用空格进行分隔")
fmt.Scanf("%d %s %f %t", &age2, &name2, &score2, &isVIP2)
//将上述数据在控制台打印输出
fmt.Printf("学生的年龄为:%v, 姓名为:%v, 成绩为:%v, 是否VIP: %v", age2, name2, score2, isVIP2)
}