这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
1. 运算符
- 这部分没啥好说的,和其它语言有着相似的运算符
- 同种数据类型的数据相除结果也是整型
- Go语言中也有指针的概念,所以就有*指针的解引用和&取地址运算符
- Go语言中没有前置自增或自减运算符
- Go语言不支持三目运算符
- Go语言有如下两种获取变量的方式
-
- fmt.Scanln()方法,这个方法直接传递变量的地址即可,遇到换行符才会停止输入
- fmt.Scanf()方法,这份方法和C语言中的scanf()方法是一样的,需要通过格式符指定变量的类型
2. 流程控制
2.1 if-else
// 1. 单分支if语句
if a == 1 {
fmt.Println("Hello World!")
}
// 2. 双分支语句
if a == 1 {
...
} else {
...
}
// 3. 多分支语句
if a == 1 {
...
} else if a == 2 {
...
} else {
...
}
/*
几点需要说明:
1. Go语言中的if语句是不需要加括号的
2. 暂时就上面一点
*/
// Go语言还可以在if的判断条件前加一个执行语句,这样可以获取返回值然后同时判断返回值,同时
// 将返回值的范围限定在if语句范围内
if a := []int{1, 2, 3}[0]; a != 2 {
fmt.Println("第一个数字不是2")
} else {
fmt.Println("第一个数字是2!")
}
2.2 for循环
1. 关于循环的说明
- Go语言中只有for循环,没有while和do while循环
- Go语言写for循环的时候后面不需要打花括号
- for循环是可以和while以及do while循环等价的
2. for
// 1. 一个最简单的for循环
for i := 0; i < 10; i++ {
fmt.Println(i + 1) // 打印1 ~ 10之间的整数
}
// 2. for循环和while等价转换
for {
// 1. 循环条件判断语句
// 2. 循环体
// 3. 更新循环变量
}
// 实际上下面这种更像while循环
for i <= 10 {
// 这里输出语句
i++ // 更新循环控制变量
}
// 3. for循环和do while等价转换
for {
// 1. 循环体
// 2. 更新循环变量
// 3. 循环条件判断语句
}
// 4. for还可以无限循环
for {}
// 5. for循环可以使用break语句跳出第二层
JumpLoop:
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
if i == 4 && j == 3 {
break JumpLoop
}
}
}
// 6. for循环还可以这么写,实际上就是将if判断整合到了for循环当中
i := 0
for i <= 10 {
// 这里可以输出一些语句
i++
}
3. for-range
3.1 语法
for position, val := range 数组/切片/字符串for key, value := range mapfor val := range channel
3.2 举例
// 1. 遍历数组和切片
for pos,val := range [...]int{1, 2, 3} {
fmt.Println("pos", pos, "val", val)
}
for pos,val := range []int{1, 2, 3} {
fmt.Println("pos", pos, "val", val)
}
// 2. 遍历字符串
for pos, val := range "hello, world" {
fmt.Println("pos", pos, "val", val) // 注意这个获取的val是rune类型, rune是int32的别名
}
// 3. 遍历map,注意使用简化赋值的时候必须显式赋值,同时键值对后面还要加上,
m := map[string]int{
"go": 1,
"web": 2,
}
for key, val := range m {
fmt.Println(key, val)
}
for _,val := range m {
fmt.Println(val) // 只获取值
}
for key,_ := range m {
fmt.Println(key) // 只获取key
}
for key := range m {
fmt.Println(key) // 只获取key
}
2.3 switch-case语句
1. 说明
- Go语言中的switch语句很灵活,后面没有要求是常量或者某种特殊类型,可以是常量、变量、有返回值的函数、有结果的表达式
- case后面表达式的值要和switch的相匹配
- Go语言中一个case就是一个语句块,不需要像C系语言那样使用break跳出
- case后面可以有多条语句(多个表达式),表达式中间用逗号分隔
- default语句不是必须的,但是建议带上
- case语句后面跟的常量值是不能重复的
- switch后面也可以不跟表达式,case语句使用类似if语句的判断条件即可
- switch语句使用fallthrough可以穿透一层case
- switch后面可以接
i := variable.(type)判断接口的类型这个i只能在switch语句范围内使用
2. 举例
// 下面只介绍go语言新添加的switch用法
// 1. 一个分支多个值
str := "Java"
switch str {
case "Java", "go": // 只要有一个匹配成功就行
fmt.Println("Java")
default:
fmt.Println("这是默认情况")
}
// 2. 分支表达式
a := 1
switch { // 这后面不用写变量
case a >= 1 && a <= 10:
fmt.Println("找到a")
default:
fmt.Println("你好")
}
2.4 goto、break和continue
- 这个没有什么多说的,只是需要注意一下break和continue都可以跳转到指定的位置
- goto语句可以用于退出执行多层循环外的语句,在代码大量重复的情况下也可以起到简化的作用
2.5 关于Go语言中的运算符的补充
- 其实go语言中的运算符和Java/C系语言中的运算符差不多,并且流程运算符也是,实际上这几着之间都是相通的