【第八篇】Golang 从菜鸟到大咖的必经之路_Go语言运算符

136 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

一、运算符的基本介绍:

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符/关系运算符
  4. 逻辑运算符
  5. 位运算符
  6. 其它运算符

二、算术运算符:

算术运算符是对数值类型的变量进行运算的,比如:加减乘除。在Go程序中使用的非常多

一、算术运算符的一览表:

运算符运算范例结果
+正号+33
-负号-4-4
+5+510
-6-42
*3*412
/5/51
%取模(取余)7%52
++自增a=2 a++a=3
--自减a=2 a--a=1
+字符串相加“he”+"llo""hello"

二、案例演示:

案例演示算术运算符的使用:

  1. +,-,*,/,%,++,--,重点讲解/,%
  2. 自增:++
  3. 自减:--
package main

import "fmt"

func main() {
	// 重点讲解 / 、%
	// 说明,如果运算符的数都是整数,那么除后,就去掉小数部分,保留整数部分
	fmt.Println(10 / 4)
	var n1 float32 = 10 / 4
	fmt.Println(n1)

	// 如果我们希望保留小数部分,则需要浮点数参与运算
	// golang 会根据参与数据运算的数据类型来判断决定后面的数据类型是什么样子的
	var n2 float32 = 10.0 / 4
	fmt.Println(n2)

}

package main

import "fmt"

func main() {
	// 重点讲解 / 、%
	// 说明,如果运算符的数都是整数,那么除后,就去掉小数部分,保留整数部分
	fmt.Println(10 / 4)
	var n1 float32 = 10 / 4
	fmt.Println(n1)

	// 如果我们希望保留小数部分,则需要浮点数参与运算
	// golang 会根据参与数据运算的数据类型来判断决定后面的数据类型是什么样子的
	var n2 float32 = 10.0 / 4
	fmt.Println(n2)

	// 演示 % 的使用
	// 看一个公式 a % b = a -a / b *b
	fmt.Println("10%3=", 10%3)     // =1
	fmt.Println("-10%3=", -10%3)   // =-1   // -10 - (-10)/ 3 * 3 = -10 - (-9) = -1
	fmt.Println("10%-3=", 10%-3)   // =1
	fmt.Println("-10%-3=", -10%-3) // =-1

}

package main

import "fmt"

func main() {

	// ++ 和 -- 的使用
	var i int = 10
	i++                  // i = i + 1
	fmt.Println("i=", i) // 11
	i--                  // i = i - 1
	fmt.Println("i=", i) //10
}


三、算术运算符使用的注意事项:

  1. 对于除号 “/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:x := 19/5 ,结果是 3
  2. 当对一个数取模时,可以等价 a%b = a-a/b*b ,这样我们可以看到取模的一个本质运算。
  3. Golang 的自增自减只能当做一个独立语言使用,不能这样使用
package main

import "fmt"

func main() {
	// 在 golang 中,++ 和 -- 只能独立使用
	// var i int = 8
	// var a int

	// a = i++  // 错误,i++ 只能独立使用
	// a = i--	// 错误,i-- 只能独立使用

	// if i++ > 0 {
	// 	fmt.Println("ok")
	// }

	var i int = 1
	i++
	// ++i // 错误,在golang中没有,前++ ,同样也没有前--
	// 通俗一点儿来说,go的++的就是没有返回值,所以前 ++ 后 ++ 没有啥区别
	fmt.Println("i=", i)
}
  1. Golang 的 ++ 和 -- 只能写在变量的后面,不能写在变量的前面,即:只有 a++ 、a - - 没有 + + a 、- - a
  2. Golang 的设计者去掉 C / Java 中的自增自减的容易混淆的写法,让Golang 更加简洁,统一。(强制性的)

四、课堂练习:

  1. 假设还有97天放假,问:XXX个星期零XX天
package main

import "fmt"

func main() {
	// 假如还有97天放假,问几个星期零几天
	var days int = 97
	var week int = days / 7
	var day int = days % 7
	fmt.Printf("%d个星期零%d天\n", week, day)
}

  1. 定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-32),请求出华氏温度对应的摄氏温度。
package main

import "fmt"

func main() {

	// 定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-32),
	// 请求出华氏温度对应的摄氏温度。
	var huashi float32 = 134.2
	var sheshi float32 = 5.0 / 9 * (huashi - 32)
	fmt.Printf("%v 对应的摄氏温度=%v \n", huashi, sheshi)
}


三、关系运算符(比较运算符)

一、基本介绍:

  1. 关系运算符的结果都是bool型,也就是要么是true,要么是false
  2. 关系表达式,经常用在if结构的条件中或循环结构的条件中

二、关系运算符一览图

运算符运算范例结果
==相等于4==3false
!=不等于4!=3true
<小于4<3false
大于4>3true
<=小于等于4<=3false
>=大于等于4>=3true

三、案例演示:

package main

import "fmt"

func main() {
	// 演示关系运算符的使用
	var n1 int = 9
	var n2 int = 8
	fmt.Println(n1 == n2)
	fmt.Println(n1 != n2)
	fmt.Println(n1 > n2)
	fmt.Println(n1 >= n2)
	fmt.Println(n1 < n2)
	fmt.Println(n1 <= n2)
	flag := n1 > n2
	fmt.Println("flag=", flag)
}

四、关系运算符的细节说明:

  1. 关系运算符的结果都是bool型,也就是要么是true,要么是false
  2. 关系运算符组成的表达式,我们称为关系表达式:a>b
  3. 比较运算符“==”不能误写成“=”!!

四、逻辑运算符:

一、基本介绍:

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值

二、逻辑运算的说明:

假定A值为True ,B值为 False

运算符描述实例
&&逻辑与运算符。如果两边的操作数都是True,则为True ,否则为False(A&&B)为False
逻辑或运算符。如果两边的操作数有一个是True,则为True ,否则为False(AB)为true
!逻辑非运算符。如果条件为True,则为False ,否则为True!(A&&B)为true

三、案例演示:

package main

import "fmt"

func main() {
	// 演示逻辑运算符的使用	&&
	var age int = 40
	if age > 30 && age < 50 {
		fmt.Println("ok1")
	}

	if age > 30 && age < 40 {
		fmt.Println("ok2")
	}

	// 演示逻辑运算符的使用	||
	if age > 30 || age < 50 {
		fmt.Println("ok3")
	}

	if age > 30 || age < 40 {
		fmt.Println("ok4")
	}

	// 演示逻辑运算符的使用	!
	if age > 30 {
		fmt.Println("ok5")
	}

	if !(age > 30) {
		fmt.Println("ok6")
	}
}

四、注意事项和细节说明:

  1. && 也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
  2. || 也叫短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true
  3. 案例演示:
package main

import "fmt"

// 声明一个函数(测试)
func test() bool {
	fmt.Println("test.......")
	return true
}
func main() {

	var i int = 10
	// 短路与
	// 说明,因为 i < 9 为 false ,因此后面的test()就不执行了。
	// if i < 9 && test() {
	// 	fmt.Println("ok......")
	// }


	// 说明,因为 i > 9 为true,因此后面的test()就不执行
	if i < 9 || test() {
		fmt.Println("hello......")
	}

}