Go 语言控制台输入&生成随机数
1. 不同基础类型之间的转化
对于不同的基础类型之间的转化,Go 提供了 strconv包。它实现了字符串与其他基本数据类型之间的转化。
其中最常用的数值转化函数是Atoi和ltoa
Atoi 方法可以将字符串类型的数值直接转化为int类型的数值,而 ltoa 可以将 int 类型的数值转化为string类型的值。
示例:控制台输入一个数值,进行数据大小的比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package main import ( "fmt" "strconv" ) func main() { var number string fmt.Println( "请输入一个整数:" ) //控制台输入,&指定一个地址 fmt.Scan(&number) fmt.Println( "数值是: " , number) fmt.Printf( "数据类型是:%T" , number) //数据类型转换string——》int //空白标识符接受err数值 value, _ := strconv.Atoi(number) //数值判断 fmt.Printf( "转换后的数据类型是: %T\n" , value) if value > 100 { fmt.Println( "数值较大" ) } else { fmt.Println( "数值较小" ) } } |
2. Go 语言随机数
go语言中的随机数应该说是伪随机
math/rand 包实现了伪随机数生成器
在go语言中随机数需要设置种子,如果不设置种子,随机数每次运行的结果相同
默认种子是1,且相同种子产生的随机数是相同的
为了保证种子不是固定的,使用time这个包来调取当前时间,采用当前时间的纳秒作为种子来生成随机数
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().Unix()) for i := 0; i < 10; i++ { value := rand.Intn(10) //Intn(10) 左闭右开区间 [0,10) fmt.Println(value) } } //执行结果如下 0 4 4 4 5 8 9 4 4 7 |
这里有二个,不能选错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | //猜商品价格,商品高低,商品价格随机生成[0-300) //如果你输入的价格大于商品价格则提示价格过高 //如果你输入的价格低于商品价格提示价格过低,直到猜中商品价格为止,并统计猜的次数 package main import ( "fmt" "math/rand" "time" ) func main() { var ( price int count int ) rand.Seed(time.Now().Unix()) real_price := rand.Intn(300) for { fmt.Println( "请输入价格:" ) fmt.Scan(&price) switch { case price == real_price: count++ fmt.Println( "恭喜你猜对价格,价格为:" , real_price) goto TAG case price > real_price: count++ fmt.Println( "价格过高,请重新输入!" ) continue default : count++ fmt.Println( "价格过低,请重新输入!" ) continue } } TAG: fmt.Println( "总共猜的次数为:" , count) } //终端交互结果如下 PS D:\goproject\src\dev_code\test01\example4\main> go run .\main.go 请输入价格: 100 价格过低,请重新输入! 请输入价格: 200 价格过低,请重新输入! 请输入价格: 280 价格过高,请重新输入! 请输入价格: 270 价格过高,请重新输入! 请输入价格: 260 价格过高,请重新输入! 请输入价格: 250 价格过高,请重新输入! 请输入价格: 240 价格过低,请重新输入! 请输入价格: 245 价格过高,请重新输入! 请输入价格: 243 价格过高,请重新输入! 请输入价格: 242 恭喜你猜对价格,价格为: 242 总共猜的次数为: 10 --------------------------------------------------------------------------------------------- //方法二 package main import ( "fmt" "math/rand" "time" ) func main() { var ( price int count int ) rand.Seed(time.Now().Unix()) real_price := rand.Intn(300) for { fmt.Println( "请输入价格:" ) fmt.Scan(&price) if price == real_price { count++ fmt.Println( "恭喜猜对价格!商品的价格为:" , real_price) break } if price > real_price { count++ fmt.Println( "价格过高,请重新输入!" ) } else { count++ fmt.Println( "价格过低,请重新输入!" ) continue } } fmt.Println( "总共猜了:" , count, "次!" ) } //输出结果 请输入价格: 100 价格过低,请重新输入! 请输入价格: 500 价格过高,请重新输入! 请输入价格: 400 价格过高,请重新输入! 请输入价格: 300 价格过高,请重新输入! 请输入价格: 200 价格过高,请重新输入! 请输入价格: 150 价格过高,请重新输入! 请输入价格: 140 价格过高,请重新输入! 请输入价格: 130 价格过高,请重新输入! 请输入价格: 122 价格过低,请重新输入! 请输入价格: 126 价格过低,请重新输入! 请输入价格: 128 恭喜猜对价格!商品的价格为: 128 总共猜了: 11 次! |
3. 高并发输入解析
大致流程如下
用户往程序控制台进行输入,当出现高并发读写的时候,所以的线程不一定能处理过来,这时候就把请求收纳到缓冲区中;
使用bufio.NewReader(os.Stdin)可以建立缓冲区,并把数据从控制台拿到缓冲区);
使用ReadLine()方式把数据从缓冲区拿到程序中,判断数据中的是否存在报错,有错误交给Err()处理并输出报错信息,而正确的字符串则提取出来给程序去使用。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package main import ( "bufio" "fmt" "os" ) func main() { fmt.Println( "请输入内容:" ) str1 := getInput() fmt.Println(str1) } //缓冲区控制台写入 func getInput() string { //bufio 缓冲区从控制台中读取输入的信息,缓冲区名为in in := bufio.NewReader(os.Stdin) //从缓冲区读取字符串信息 str, _, err := in .ReadLine() if err != nil { return err.Error() } return string (str) } //终端输出结果如下 请输入内容: hello hello |
示例
使用Scan()
相比于上面的方法,可以自定义报错信息,代码更简洁方便
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package main import ( "bufio" "fmt" "os" ) func main() { fmt.Println( "请输入内容:" ) str1 := getInputByScanner() fmt.Println(str1) } func getInputByScanner() string { var str string //使用os.Stdin开始输入流 in := bufio.NewScanner(os.Stdin) if in .Scan() { str = in .Text() } else { str = "Find input error" } return str } //结果如下 请输入内容: hello hello |