一、if判断
- Go语言中if条件判断的格式如下:
if 表达式1 {
分支1
} else if 表达式2 {
分支2
} else{
分支3
}
当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。 if判断中的else if和else都是可选的,可以根据实际需要进行选择。
Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个if或else if右边的大括号在同一行。
示例:
package main
import (
"fmt"
)
func main() {
// 单条件判断
level := 15
if level > 20 {
fmt.Println("恭喜你!!可以转职了!")
} else {
fmt.Println("再接再厉!!")
}
// 多条件判断
age := 20
if age > 35 {
fmt.Println("人到中年了")
} else if age > 18 {
fmt.Println("青年")
}
// 直接在判断中声明变量,声明的变量作用域只在判断语句内,在这个判断语句外,该变量无效
// 这种在判断语句中定义变量的好处:当条件判断语句执行结束,该变量也会被回收
if name := "xiaoming"; name == "xiaoming" {
fmt.Println("他是小明")
} else {
fmt.Println("他不是小明")
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
再接再厉!!
青年
他是小明
二、switch 和 case 循环
- 使用switch语句可方便地对大量的值进行条件判断。
- switch传入的变量和case的值做比较(一旦匹配上就会退出循环,后面的不做比较)
示例
package main
import (
"fmt"
)
func switchDemo1() {
finger := "c"
switch finger {
case "a":
fmt.Println(1)
case "b":
fmt.Println(2)
case "c":
fmt.Println(3)
default:
fmt.Println("无效的输入!")
}
}
func main() {
switchDemo1()
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
3
- 变量可以直接在switch后面定义
func switchDemo1() {
switch finger := "b"; finger {
case "a":
fmt.Println(1)
case "b":
break
case "c":
fmt.Println(3)
default:
fmt.Println("无效的输入!")
}
}
- case可以匹配多个值
func switchDemo1() {
switch finger := "d"; finger {
case "a", "d", "h":
fmt.Println(1)
case "b":
break
case "c":
fmt.Println(3)
default:
fmt.Println("无效的输入!")
}
}
- 在case后,可以加上判断(在switch后不传入变量,直接在case中定义判断)
package main
import (
"fmt"
)
func switchDemo1() {
age := 20
switch {
case age > 18:
fmt.Println("成年")
case age > 18 && age < 35:
fmt.Println("青年")
default:
fmt.Println("未成年!")
}
}
func main() {
switchDemo1()
}
- fallthrough语法可以执行满足条件的case的下一个case,是为了兼容C语言中的case设计的。(不常用,作为了解即可)
func switchDemo1() {
s := "a"
switch {
case s == "a":
fmt.Println("a")
fallthrough
case s == "b":
fmt.Println("b")
case s == "c":
fmt.Println("c")
default:
fmt.Println("...")
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
a
b
三、for循环
1、for循环的基本写法
- for循环的基本格式如下:
for 初始语句;条件表达式;结束语句{
循环体语句
}
条件表达式返回true时循环体不停地进行循环,直到条件表达式返回false时自动退出循环。
示例:
func forDemo() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
- for循环的初始语句可以被忽略,但是初始语句后的分号必须要写,
例如:
func forDemo2() {
i := 0
for ; i < 10; i++ {
fmt.Println(i)
}
}
- for循环的初始语句和结束语句都可以省略
例如:
func forDemo3() {
i := 0
for i < 10 {
fmt.Println(i)
i++
}
}
- 输出九九乘法表示例
package main
import (
"fmt"
)
func main() {
for i := 1; i < 10; i++ {
for n := 1; n <= i; n++ {
fmt.Printf("%d*%d=%d\t", n, i, i*n)
}
fmt.Println("")
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
2、for无限循环(类似while死循环)
- 在Go语言中只有for循环,没有while循环
for {
循环体语句
}
示例:
func main() {
i := 1
for i < 30 {
fmt.Println(i)
}
}
3、for range(键值循环)
- Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。
- 通过for range遍历的返回值有以下规律:
- 1、数组、切片、字符串返回索引和值。
- 2、map返回键和值。
- 3、通道(channel)只返回通道内的值。
package main
import (
"fmt"
)
func main() {
s := "abcdef"
for i, v := range s {
fmt.Printf("%c ", v)
fmt.Println(i, v)
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
a 0 97
b 1 98
c 2 99
d 3 100
e 4 101
f 5 102
3、break(跳出循环)
- break(跳出循环)
- break语句可以结束for、switch和select的代码块。
- break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for、switch和 select的代码块上。
3.1、跳出单次循环
示例
package main
import (
"fmt"
)
func main() {
for i := 1; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
1
2
3
4
3.2、跳出多次循环
方法1:利用label的方式(不建议经常使用,label使用会使代码变得难懂)
func breakDemo1() {
BREAKDEMO1:
for i := 0; i < 3; i++ {
for j := 'A'; j < 'Z'; j++ {
if j == 'C' {
break BREAKDEMO1 // 直接跳出到标签处开始执行
}
fmt.Printf("%v-%c\n", i, j)
}
}
fmt.Println("over")
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
0-A
0-B
over
方法二:利用布尔值(推荐使用)
func breakDemo1() {
flag := false // 定义一个falg,充当标签
for i := 0; i < 3; i++ {
for j := 'A'; j < 'Z'; j++ {
if j == 'C' {
flag = true
break
}
if flag {
break
}
fmt.Printf("%v-%c\n", i, j)
}
}
fmt.Println("over")
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
0-A
0-B
over
4、continue(跳过此次,后面的继续执行)
- continue(跳过此次,后面的继续执行)
- continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用。
示例:
package main
import (
"fmt"
)
func main() {
for i := 1; i < 6; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
1
2
4
5
注意:使用continue时,不能使用下面这种用法,程序会hung住
func main() {
i := 1
for i < 6 {
if i == 3 {
continue // 当i=3时,程序会跳过,回到上面的循环中,但是此时i依旧是3,所以会一直hung住
}
fmt.Println(i)
i++
}
}
- 在 continue语句后添加标签时,表示开始标签对应的循环。
示例1:
package main
import (
"fmt"
)
func continueDemo() {
forloop1:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 || j == 1 {
continue forloop1 // 满足条件,就会跳转到forloop1标签位置继续执行
}
fmt.Printf("%v-%v\n", i, j)
}
}
}
func main() {
continueDemo()
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
0-0
2-0
示例2:
package main
import (
"fmt"
)
func continueDemo() {
for i := 0; i < 3; i++ {
forloop2:
for j := 0; j < 3; j++ {
if i == 1 || j == 1 {
continue forloop2 // 满足条件,就会跳转到forloop2标签位置继续执行
}
fmt.Printf("%v-%v\n", i, j)
}
}
}
func main() {
continueDemo()
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
0-0
0-2
0-3
4、goto语句(不建议经常使用)
- goto语句通过标签进行代码间的无条件跳转。
- goto语句可以在快速跳出循环、避免重复退出上有一定的帮助。
- Go语言中使用goto语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时(和break多重循环退出类似)
func gotoDemo1() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 设置退出标签
goto GotoTag
}
fmt.Printf("%v-%v\n", i, j)
}
}
return
// 标签
GotoTag:
fmt.Println("结束for循环")
}
输出结果
E:\GoProject\src\gitee.com\LTP\day01\变量、常量> go run .\main.go
0-0
0-1
结束for循环