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 = 0
fmt.Println("time Unix==", time.Now().UnixNano())
for {
rand.Seed(time.Now().UnixNano())
var r int = rand.Intn(100) + 1
fmt.Printf("%T %v \n", r, r)
times++
if r == 99 {
break
}
}
fmt.Printf("生成99,一共用了%v次", times)
}
label标签的使用
多层嵌套循环中,可以通过标签指明要终止的是那一层语句块。
label:
break label2
// break label
testlabel:
for i := 0; i < 5; i++ {
// label1: // 默认的,break就近原则
for j := 0; j < 10; j++ {
if j == 2 {
break testlabel // 直接跳出到最外层循环
}
fmt.Println("j=", j)
}
}
j= 0
j= 1
练习
// 登录验证,三次机会,提示剩余次数
var name string
var pwd string
var loginChance int = 3
for 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("机会用完,没有登录成功,明天再试")
}