我是靠谱客的博主 欢呼小松鼠,这篇文章主要介绍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("转换后的数据类型是: %Tn", 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
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:goprojectsrcdev_codetest01example4main> 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
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
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 

到此这篇关于Go语言实现控制台输入&生成随机数详解的文章就介绍到这了,更多相关Go语言输入生成随机数内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是欢呼小松鼠最近收集整理的关于Go语言实现控制台输入&生成随机数详解的全部内容,更多相关Go语言实现控制台输入&生成随机数详解内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(127)

评论列表共有 0 条评论

立即
投稿
返回
顶部