分支控制
单分支
package main
import "fmt"
func main() {
var age byte
fmt.Println("请输入你的年龄:")
_, _ = fmt.Scanln(&age)
if age > 18 {
fmt.Println("你已经成年了,要对自己的行为负责了。")
}
}
- Go支持在
if 语句中直接定义一个变量,该变量的作用域只限于本if 语句
package main
import "fmt"
func main() {
if age := 20; age > 18 {
fmt.Println("你已经成年了,要对自己的行为负责了。")
}
}
双分支
package main
import "fmt"
func main() {
var age byte
fmt.Println("请输入你的年龄:")
_, _ = fmt.Scanln(&age)
if age > 18 {
fmt.Println("你已经成年了,要对自己的行为负责了。")
} else {
fmt.Println("你还没成年,这次放过你。")
}
}
package main
import "fmt"
func main() {
var year uint
fmt.Println("请输入年份,我来判断是否是闰年:")
_, _ = fmt.Scanln(&year)
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
fmt.Printf("%d年是闰年", year)
} else {
fmt.Printf("%d年不是闰年", year)
}
}
多分支
package main
import "fmt"
func main() {
var score uint
fmt.Println("请输入你的考试成绩:")
_, _ = fmt.Scanln(&score)
if score == 100 {
fmt.Println("奖励你一个手机")
} else if score >= 80 {
fmt.Println("奖励你一辆玩具车")
} else if score >= 60 {
fmt.Println("奖励你一本作业")
} else {
fmt.Println("你考得太差了,什么奖励都没有")
}
}
switch
switch /case 后是一个表达式(常量、变量、有返回值的函数等)case 后的表达式的值的数据类型必须和switch 后的表达式的数据类型一致
package main
import "fmt"
func test() byte {
return 1
}
func main() {
var n byte = 1
switch test() {
case n:
fmt.Println("ok1")
case 2:
fmt.Println("ok2")
default:
fmt.Println("err")
}
}
case 后可以带多个表达式,使用逗号分隔,表示或者的意思
package main
import "fmt"
func main() {
var n byte
fmt.Println("请输入星期的数字号:")
_, _ = fmt.Scanln(&n)
switch n {
case 1, 2, 3, 4, 5, 6:
fmt.Printf("星期%v", n)
case 7:
fmt.Println("星期日")
default:
fmt.Printf("没有星期%v", n)
}
}
case 后的表达式如果是常量,则要求不能重复case 后代码块的结尾处不需要break ,程序匹配到一个case 后就会执行对应的代码块,执行完就会退出switch ,如果一个都匹配不到,则执行default default 不是必须的switch 后也可以不带表达式,类似if--else 分支来使用
package main
import "fmt"
func main() {
var grade float32
fmt.Println("请输入你的成绩:")
_, _ = fmt.Scanln(&grade)
switch {
case grade == 100:
fmt.Println("哇,满分哦")
case grade >= 80:
fmt.Println("优秀")
case grade >= 60:
fmt.Println("良好")
default:
fmt.Println("不及格")
}
}
switch 后也可以直接声明一个变量,分号结束声明,但不推荐这样做,知道有就行
package main
import "fmt"
func main() {
switch grade := 50; {
case grade >= 60:
fmt.Println("合格")
default:
fmt.Println("不合格")
}
}
switch 穿透fallthrough ,如果在case 后代码块结尾处写上fallthrough 语句,则会继续执行下一个case
package main
import "fmt"
func main() {
var n = 1
switch n {
case 1:
fmt.Println(1)
fallthrough
case 2:
fmt.Println(2)
default:
fmt.Println("其他")
}
}
type switch :switch 语句还可以被用于type switch 来判断某个interface 变量中实际指向的变量类型
package main
import "fmt"
func main() {
var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil:
fmt.Printf("x的类型是%T", i)
case int:
fmt.Println("x是int类型")
case float64:
fmt.Println("x是float64类型")
case func(int) float64:
fmt.Println("x是func(int)类型")
case bool, string:
fmt.Println("x是bool或string类型")
default:
fmt.Println("未知类型")
}
}
循环控制
for
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println("Hello World", i)
}
}
package main
import "fmt"
func main() {
i := 0
for i < 10 {
fmt.Println("Hello World", i)
i++
}
}
package main
import "fmt"
func main() {
i := 0
for {
fmt.Println("Hello World", i)
i++
if i == 10 {
break
}
}
}
- Go提供
for-range 的方式,可以很方便地遍历字符串和数组(数组的遍历等我们学到数组的时候再讲),案例说明如何遍历字符串
package main
import "fmt"
func main() {
str := "Hello世界"
for i := 0; i < len(str); i++ {
fmt.Printf("str[%d]=%c ", i, str[i])
}
fmt.Println()
for i, v := range str {
fmt.Printf("str[%d]=%c ", i, v)
}
}
结果:
- 如果字符串中含有中文,那么传统遍历字符串的方式就是错误的,会出现乱码。原因:传统的是按照字节来遍历,而一个汉字在UTF-8编码中占3个字节。解决办法:需要将字符串转成
[]rune切片 ,这里只做演示,不过多说明,等后面学到再讲
package main
import "fmt"
func main() {
str := "Hello世界"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
fmt.Printf("str2[%d]=%c ", i, str2[i])
}
}
- 打印金字塔
一般地,如果一个数列从第2项起,每一项与它的前一项的差等于同一个常数,这个数列就叫做等差数列,这个常数叫做等差数列的公差,公差通常用字母d表示,等差数列通项公式:an=a1+(n-1)d
package main
import "fmt"
func main() {
rows := 5
for i := 1; i <= rows; i++ {
for j := 1; j <= rows-i; j++ {
fmt.Printf(" ")
}
for j := 1; j <= 2*i-1; j++ {
fmt.Printf("*")
}
fmt.Println()
}
}
package main
import "fmt"
func main() {
rows := 5
for i := 1; i <= rows; i++ {
for j := 1; j <= rows-i; j++ {
fmt.Printf(" ")
}
for j := 1; j <= 2*i-1; j++ {
if j == 1 || j == 2*i-1 || i == rows {
fmt.Printf("*")
} else {
fmt.Printf(" ")
}
}
fmt.Println()
}
}
break
- 引出问题:随机生成1 ~ 100的整数,直到生成99这个数,看一共生成了多少次?
- 生成随机整数的方法
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
fmt.Println(time.Now().Unix())
rand.Seed(time.Now().Unix())
fmt.Println(rand.Intn(100))
}
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var n, counter int
rand.Seed(time.Now().Unix())
for {
n = rand.Intn(100) + 1
counter++
fmt.Printf("%v ", n)
if n == 99 {
break
}
}
fmt.Printf("\n一共花费了%v次才生成99这个数", counter)
}
break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
package main
import "fmt"
func main() {
label:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break label
}
fmt.Printf("%v ", j)
}
}
}
continue
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Printf("%v ", i)
}
}
package main
import "fmt"
func main() {
tag:
for i := 0; i < 2; i++ {
for j := 0; j < 100; j++ {
if j == 2 {
continue tag
}
fmt.Printf("%v ", j)
}
}
}
goto
goto 语句可以无条件地转移到程序中指定的行goto 语句通常与条件语句配合使用,可以用来实现条件转移,跳出循环体等功能- 一般不主张使用
goto 语句,以免造成程序流程的混乱,使理解和调试程序产生困难
package main
import "fmt"
func main() {
for i := 0; i < 100; i++ {
if i == 3 {
goto abc
}
fmt.Printf("%v ", i)
}
abc:
fmt.Printf("程序结束")
}
|