(文章目录)
单分支
if condition {
代码块
}
if 5 > 2 {
fmt.Println("5 greater than 2")
}
==注意==:Go语言中,花括号一定要跟着if、for、func等行的最后,否则语法出错。这其实就是为了解决C 风格、Java风格之争。
- condition必须是一个bool类型,在Go中,不能使用其他类型等效为布尔值。 if 1 {} 是错误的
- 语句块中可以写其他代码
- 如果condition为true,才能执行其后代码块
多分支
if condition1 {
代码块1
} else if condition2 {
代码块2
} else if condition3 {
代码块3
} ... {
...
} else if conditionN {
代码块N
} else {
代码块
}
a := 6
if a < 0 {
fmt.Println("negative")
} else if a > 0 { // 走到这里一定 a 不小于 0
fmt.Println("positive")
} else { // 走到这里一定 a 不大于、也不小于 0
fmt.Println("zero")
}
- 多分支结构,从上向下依次判断分支条件,只要一个分支条件成立,其后语句块将被执行,那么其 他条件都不会被执行
- 前一个分支条件被测试过,下一个条件相当于隐含着这个条件
- 一定要考虑一下else分支是有必要写,以防逻辑漏洞
switch分支
a := 20
switch a { // 待比较的是a
case 10:
fmt.Println("ten")
case 20:
fmt.Println("twenty")
case 30, 40, 50: // 或关系
fmt.Println(">=30 and <=50")
default:
fmt.Println("other")
}
switch a:=20;a { // 待比较的是a
case 10:
fmt.Println("ten")
case 20:
fmt.Println("twenty")
case 30, 40, 50: // 或关系
fmt.Println(">=30 and <=50")
default:
fmt.Println("other")
}
==2种写法a的作用域问题==
==从上面3张图片可以看出,第一种写法a整个函数都有效,第二种写法 a只对当前switch有效==
C语言的switch有穿透效果,而Go语言没有。如果想在Go语言中实现穿透效果,使用fallthrough穿透当前case语句块。
for循环
注意:Go语言没有提供while关键字,可以用for方便的替代
C风格for
for [初始操作];[循环条件];[循环后操作] {
循环体
}
- 初始操作:第一次进入循环前执行,语句只能执行一次,之后不再执行
- 循环条件:要求返回布尔值,每次进入循环体前进行判断。如果每次条件满足返回true,就进入循 环执行一次循环体;否则,循环结束
- 循环后操作:每次循环体执行完,在执行下一趟循环条件判断之前,执行该操作一次
for i := 0; i < 10; i++ {
fmt.Println(i)
}// 初始操作中的短格式定义的i的作用域只能在for中
// 特殊写法
for i := 5; i < 10; {}
for i := 5; ; {} // 没条件就相当于true
for i < 10 {} // for condition {},condition就是循环条件
for ;; {} // 死循环
// 死循环简写如下
for {} // 死循环 相对于 for true {}
continue
中止当前这一趟循环体的执行,直接执行“循环后操作”后,进入下一趟循环的条件判断。
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue
}
fmt.Println(i)
}
break
终止当前循环的执行。
for i := 0; ; i++ {
if i%2 == 0 {
continue
}
fmt.Println(i)
if i >= 10 {
break
}
}
除了break,函数的return结束函数执行,当然也能把函数中的循环打断。
goto label
这里我不推荐使用,想了解的可以去官方文档自己看下
for range
for i, v := range "abcd测试" {
fmt.Printf("%d, %[2]d, %[2]c, %#[2]x\n", i, v)
}
fmt.Println("\xe6\xb5\x8b\xe8\xaf\x95") // 6个字节
- 索引就是字节偏移量,从索引可以看出,中文在字符串中是utf-8编码,占3个字节。但是for range读取字符串返回的是一个个字符(整数),而字符是ASCII或UNICODE对应的编码值。
- %d 打印的是unicode值 -%c 打印的是字符
训练
fmt.Print("=======================九九乘法表=====================\n")
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
var s = i * j
if s < 10 {
fmt.Printf("%d * %d = %d ", j, i, i*j)
} else {
fmt.Printf("%d * %d = %d ", j, i, i*j)
}
}
fmt.Print("\n")
}