break就近原则,跳出最近的for循环
随机生成一个0 - 100以内的数,直到生成99这个数字的时候,统计一共生成了多少随机数
import “math/rand”
rand包实现了伪随机数生成器。
随机数从资源生成。包水平的函数都使用的默认的公共资源。该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go程并发。
func Seed(seed int64)
使用给定的seed将默认资源初始化到一个确定的状态;
如未调用Seed,默认资源的行为就好像调用了Seed(1)。
func Intn(n int) int
返回一个取值范围在[0,n)的伪随机int值,如果n<=0会panic。
import “time”
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。
func Now() Time
Now返回当前本地时间。 1970-01-01 零时零分零秒到现在的秒数
func (t Time) Unix() int64
Unix将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)。
func (t Time) UnixNano() int64
UnixNano将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)。如果纳秒为单位的unix时间超出了int64能表示的范围,结果是未定义的。注意这就意味着Time零值调用UnixNano方法的话,结果是未定义的。
import ("fmt""math/rand" // rand包实现了伪随机数生成器。"time" // time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。)func main() {// 随机数生成// 设置种子var times int = 0fmt.Println("time Unix==", time.Now().UnixNano())for {rand.Seed(time.Now().UnixNano())var r int = rand.Intn(100) + 1fmt.Printf("%T %v \n", r, r)times++if r == 99 {break}}fmt.Printf("生成99,一共用了%v次", times)}
label标签的使用
多层嵌套循环中,可以通过标签指明要终止的是那一层语句块。
label:
break label2
// break labeltestlabel:for i := 0; i < 5; i++ {// label1: // 默认的,break就近原则for j := 0; j < 10; j++ {if j == 2 {break testlabel // 直接跳出到最外层循环}fmt.Println("j=", j)}}j= 0j= 1
练习
// 登录验证,三次机会,提示剩余次数var name stringvar pwd stringvar loginChance int = 3for i := 0; i < 3; i++ {fmt.Println("请输入用户名")fmt.Scanln(&name)fmt.Println("请输入密码")fmt.Scanln(&pwd)if name == "xiao" && pwd == "666" {fmt.Println("登录成功")break} else {loginChance--fmt.Printf("您还有%d次机会\n", loginChance)}}if loginChance == 0 {fmt.Println("机会用完,没有登录成功,明天再试")}
