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方法的话,结果是未定义的。

  1. import (
  2. "fmt"
  3. "math/rand" // rand包实现了伪随机数生成器。
  4. "time" // time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。
  5. )
  6. func main() {
  7. // 随机数生成
  8. // 设置种子
  9. var times int = 0
  10. fmt.Println("time Unix==", time.Now().UnixNano())
  11. for {
  12. rand.Seed(time.Now().UnixNano())
  13. var r int = rand.Intn(100) + 1
  14. fmt.Printf("%T %v \n", r, r)
  15. times++
  16. if r == 99 {
  17. break
  18. }
  19. }
  20. fmt.Printf("生成99,一共用了%v次", times)
  21. }

label标签的使用

多层嵌套循环中,可以通过标签指明要终止的是那一层语句块。
label:
break label2

  1. // break label
  2. testlabel:
  3. for i := 0; i < 5; i++ {
  4. // label1: // 默认的,break就近原则
  5. for j := 0; j < 10; j++ {
  6. if j == 2 {
  7. break testlabel // 直接跳出到最外层循环
  8. }
  9. fmt.Println("j=", j)
  10. }
  11. }
  12. j= 0
  13. j= 1

练习

  1. // 登录验证,三次机会,提示剩余次数
  2. var name string
  3. var pwd string
  4. var loginChance int = 3
  5. for i := 0; i < 3; i++ {
  6. fmt.Println("请输入用户名")
  7. fmt.Scanln(&name)
  8. fmt.Println("请输入密码")
  9. fmt.Scanln(&pwd)
  10. if name == "xiao" && pwd == "666" {
  11. fmt.Println("登录成功")
  12. break
  13. } else {
  14. loginChance--
  15. fmt.Printf("您还有%d次机会\n", loginChance)
  16. }
  17. }
  18. if loginChance == 0 {
  19. fmt.Println("机会用完,没有登录成功,明天再试")
  20. }