Go 语言控制台输入&生成随机数

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

  

 

posted @   隐姓埋名4869  阅读(347)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示