标题:[实践OK]golang随机数生成踩过的坑记录一下,在学习go的if和switch的变量作用域时遇到的。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Sun, 06 Mar 2022 22:36:51 +0000 作者:jackxiang 地址:https://jackxiang.com/post/11243/ 内容: cat short-if.go package main import( "fmt" "math/rand" "time" ) func main(){ rand.Seed(time.Now().Unix()) if num := rand.Intn(3); num == 0 { fmt.Println(num) fmt.Println("Space Adventures") } else if num == 1 { fmt.Println(num) fmt.Println("SpaceX") }else{ fmt.Println(num) fmt.Println("Virgin Galactic") } } go build short-if.go ./short-if 1 SpaceX ./short-if 2 Virgin Galactic ./short-if 0 Space Adventures 如果不加: rand.Seed(time.Now().Unix()) 其值一直是:2 原因是:https://blog.csdn.net/weixin_33816821/article/details/94581126 Go语言的switch语法学习之num的简短声明也可用于switch语句的一部分: package main import( "fmt" "math/rand" "time" ) func main(){ rand.Seed(time.Now().Unix()) switch num := rand.Intn(10); num { case 0: fmt.Println("Space Adventure") case 1: fmt.Println("SpaceX") case 2: fmt.Println("Virgin Galactic") default: fmt.Println("Random spaceline #",num) } } ./short-switch Virgin Galactic ./short-switch Random spaceline # 4 cat scope-rules.go #几月有多少天的一个判断: package main import( "fmt" "math/rand" "time" ) var era = "AD" func main(){ year := 2018 rand.Seed(time.Now().Unix()) switch month := rand.Intn(12) + 1;month { case 2: day := rand.Intn(28) + 1 fmt.Println(era, year, month, day) case 4, 6, 9, 11: day := rand.Intn(30) + 1 fmt.Println(era, year, month, day) default: day := rand.Intn(31) + 1 fmt.Println(era, year, month, day) } } ./scope-rules AD 2018 10 24 default: day := rand.Intn(31) + 1 fmt.Println(era, year, month, day) } fmt.Println(month,day) //作用域不再有了。 go build scope-rules.go # command-line-arguments ./scope-rules.go:22:14: undefined: month ./scope-rules.go:22:20: undefined: day 包括switch的每个case也是都拥有自己独立的作用域,每个分支里面的day变量在分支结束后,day变量将不再处于作用域之内,switch分支的作用域是唯一一种无需使用大括号标识的作用域。 cat random-date.go package main import( "fmt" "math/rand" "time" ) var era = "AD" func main(){ rand.Seed(time.Now().Unix()) year := 2018 month := rand.Intn(12) + 1 daysInMonth := 31 switch month { case 2: daysInMonth = 28 case 4, 6, 9, 11: daysInMonth = 30 } day := rand.Intn(daysInMonth) + 1 fmt.Println(era, year, month, day) } #./random-date AD 2018 11 30 #./random-date AD 2018 11 30 研究下闰年: cat random-date-study.go package main import( "fmt" "math/rand" "time" ) var era = "AD" func main(){ rand.Seed(time.Now().Unix()) year := 2018 + rand.Intn(5) //year := 2000 leep := year%400 == 0 || (year%4 == 0 && year%100 != 0) //是否是闰年Boole month := rand.Intn(12) + 1 daysInMonth := 31 switch month { case 2: if leep{ daysInMonth = 29 } else { daysInMonth = 28 } case 4, 6, 9, 11: daysInMonth = 30 } for i := 0;i < 10 ;i++ { day := rand.Intn(daysInMonth) + 1 fmt.Println(era, year, month, day) } } ./random-date-study AD 2000 2 18 AD 2000 2 4 AD 2000 2 6 AD 2000 2 8 AD 2000 2 7 AD 2000 2 21 AD 2000 2 7 AD 2000 2 29 AD 2000 2 12 AD 2000 2 12 Generated by Jackxiang's Bo-blog 2.1.1 Release