算术运算符
正号+
,负号-
,加+
,减-
,乘-
,除/
,取模(取余)%
,自增++
,自减--
,字符串相加+
func main () {
//演示 / 的使用
//如果运算的数都是整数,那么除后,去掉小数部分,保留整数部分
fmt.Println(11 / 4) // 2
var n1 float32 = 11 / 4
fmt.Println(n1) // 2
//如果我们希望保留小数部分,则需要有浮点数参与运算
var n2 float32 = 11.0 / 4
fmt.Println(n2) // 2.75
// 演示 % 的使用
// 看一个公式 a % b = a - a / b * b
fmt.Println("10%3=", 10 % 3) // 1
fmt.Println("-10%3=", -10 % 3) // -10 - (-10) / 3 * 3 = -10 - (-9) = -1
fmt.Println("10%-3=", 10 % -3) // 1
fmt.Println("-10%-3=", -10 % -3) // -1
// ++ 和 --的使用
var i int = 10
i++ // 等价 i = i + 1
fmt.Println("i=", i) // 11
i-- // 等价 i = i - 1
fmt.Println("i=", i) // 10
if i > 0 {
fmt.Println("ok")
}
}
- 对于除号
\
,整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分 - 对于取模
%
,其本质为a % b = a - a / b * b
- 自增
++
和自减--
只能当作一个独立的语言使用,且只能写在变量的后面,详细看下面的例子:
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没有 前++
i--
--i // 错误,在golang没有 前--
fmt.Println("i=", i)
}
关系运算符(比较运算符)、逻辑运算符
- 关系运算符
等于==
,不等于!=
,小于<
,大于>
,小于等于<=
,大于等于>=
关系表达式的结果都是bool型,即true或者false - 逻辑运算符
逻辑与(短路与)&&
,逻辑或(短路或)||
,逻辑非!
逻辑与,如果第一个条件为false,则第二个条件不会判断,最终为false
逻辑或,如果第一个条件为true,则第二个条件不会判断,最终为true
因此,在写逻辑判断关系式的时候,尽量把计算简单的写在前面,节省计算量
//声明一个函数(测试)
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...")
} //没有输出
if i > 9 || test() {
fmt.Println("hello...")
} // hello...
//演示逻辑运算符的使用 &&
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")
}
}
赋值运算符、位运算符、其他运算符
- 赋值运算符
赋值=
,相加后赋值+=
,相减后赋值-=
,相乘后赋值*=
,相除后赋值/=
,求余后赋值%=
,左移后赋值<<=
,右移后赋值>>=
,按位与后赋值&=
,按位异或后赋值^=
,按位或后赋值|=
- 位运算符
按位与&
,按位或|
,按位异或^
,左移<<
,右移>>
- 其他运算符
返回变量存储位置&
,指针变量*
go不支持三元运算,因为go的设计理念是“一种事情有且仅有一种方法完成”
运算符优先级
获取键盘输入
调用fmt包的fmt.Scanln()
或者fmt.Scanf()
ScanIn
类似Scan,但会在换行时才停止扫描,最后一个条目必须有换行或者到达结束位置Scanf
从标准输入扫描文本,根据format参数指定的格式 将成功读取的空白分隔的值 保存进传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误
func main() {
//从控制台接收用户信息,【姓名、年龄、薪水、是否通过考试 】
//先声明需要的变量
var name string
var age byte
var sal float32
var isPass bool
//方式1 fmt.Scanln
fmt.Println("请输入姓名: ") //当程序执行到 fmt.Scanln(&name),程序会停止在这里,等待用户输入,并回车
fmt.Scanln(&name)
fmt.Println("请输入年龄: ")
fmt.Scanln(&age)
fmt.Println("请输入薪水: ")
fmt.Scanln(&sal)
fmt.Println("请输入是否通过考试: ")
fmt.Scanln(&isPass)
fmt.Printf("名字是: %v \n 年龄是: %v \n 薪水是: %v \n 是否通过考试: %v \n\n\n\n\n", name, age, sal, isPass)
//方式2:fmt.Scanf,可以按指定的格式输入
fmt.Println("请依次输入你的姓名、年龄、薪水、是否通过考试, 并使用空格隔开")
fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
fmt.Printf("名字是: %v \n年龄是: %v \n 薪水是: %v \n 是否通过考试: %v \n", name, age, sal, isPass)
}
//请输入姓名:
//小弟
//请输入年龄:
//20
//请输入薪水:
//20000
//请输入是否通过考试:
//true
//名字是: 小弟
//年龄是: 20
//薪水是: 20000
//是否通过考试: true
//
//
//
//
//请依次输入你的姓名、年龄、薪水、是否通过考试, 并使用空格隔开
//小弟 21 30000 true
//名字是: 小弟
//年龄是: 21
//薪水是: 30000
//是否通过考试: true