运算符的优先级
算术运算符
a % b = a - (a/b) * b
// 参与运算的数都是int类型,结果也就是int类型,小数部分舍去, 保留整数部分
var n = 10 / 4
fmt.Printf("%T %v", n, n) // int 2
// 如果需要保留小数部分,则需要浮点数参与运算
var n = 10.0 / 4
fmt.Printf("%T %v", n, n) // float64 2.5
var n float64 = 10 / 4
fmt.Printf("%T %v", n, n) // float64 2
// % 取模
var n1 = 10 % 3
fmt.Printf("%T %v \n", n1, n1) // int 1
// 公式: a % b = a - (a/b) * b
var n1 = -10 % 3
// -10 - (-3) * 3 = -10 - (-9) = -1
fmt.Printf("%T %v \n", n1, n1) // int -1
var n2 = 10 % -3
fmt.Printf("%T %v \n", n2, n2) // int 1
var n3 = -10 % -3
fmt.Printf("%T %v \n", n3, n3) // int -1
// ++ --
// 只能独立使用
// 只能写在变量后面 i++ i--
var i int = 10
var a int
i++ // ++ -- 只能独立使用, a = i++ 报错, 因为golang会自动在一行语句后面添加 ; 分号
a = i
fmt.Printf("%T %v", a, a)
if i++ > 10 { // 报错
}
// Golang的设计者,去掉c/java中自增自减容易混淆的写法,让Go更见简洁统一 ^v^
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定变量
func test() int {
return 10
}
func main() {
fmt.Println(model.Name)
// 交换变量的值, 不使用中间变量
// a = 9, b = 2 => a = 2, b = 9
a := 9
b := 2
a = a + b
b = a - b // b = a
a = a - b // a = b
fmt.Printf("a=%T %v \n", a, a)
fmt.Printf("b=%T %v \n", b, b)
var n int
n = test() + 2 // 右边可以是表达式
fmt.Printf("n=%T %v \n", n, n)
}
比较运算符/关系运算符
关系运算符的结果都是bool型,要么是true,要么是false
关系表达式经常用在 if结构 或者 for循环结构
var n1 int = 9
var n2 int = 8
var res = n1 > n2
fmt.Printf("%T %v \n", res, res) // bool true
逻辑运算符
用于连接多个条件(一般来讲就是关系表达式),最终结果也是一个bool值
短路与
短路或
// 与、或、非
var age int = 20
if age > 18 && age < 30 {
fmt.Println("小伙纸")
}
if age > 70 || age < 10 {
fmt.Println("老夫或者是小盆友")
}
if !(age > 50) {
fmt.Println("钢铁侠")
}
// 短路与, 短路或
// 声明一个函数
func testfn() bool {
fmt.Println("==^v^==")
return true
}
func main() {
fmt.Println(model.Name)
var i int = 10
if i < 9 && testfn() { // (i > 9 && testfn()) (i < 9 || testfn())
fmt.Printf("%T %v", i, i)
}
}
位运算符
二进制运算
查看计算机底层知识
其它运算符
Go语言不支持三目运算
使用 if … else …
a1 := 100
fmt.Println("a1的地址:", &a1) // a1的地址: 0xc0000140d0
var ptr *int = &a1
fmt.Println("ptr指向的值是:", *ptr) // ptr指向的值是: 100