Go語言實(shí)現(xiàn)控制臺輸入&生成隨機(jī)數(shù)詳解
1. 不同基礎(chǔ)類型之間的轉(zhuǎn)化
對于不同的基礎(chǔ)類型之間的轉(zhuǎn)化,Go 提供了 strconv包。它實(shí)現(xiàn)了字符串與其他基本數(shù)據(jù)類型之間的轉(zhuǎn)化。
其中最常用的數(shù)值轉(zhuǎn)化函數(shù)是Atoi和ltoa
Atoi 方法可以將字符串類型的數(shù)值直接轉(zhuǎn)化為int類型的數(shù)值,而 ltoa 可以將 int 類型的數(shù)值轉(zhuǎn)化為string類型的值。
示例:控制臺輸入一個(gè)數(shù)值,進(jìn)行數(shù)據(jù)大小的比較
package main
import (
"fmt"
"strconv"
)
func main() {
var number string
fmt.Println("請輸入一個(gè)整數(shù):")
//控制臺輸入,&指定一個(gè)地址
fmt.Scan(&number)
fmt.Println("數(shù)值是: ", number)
fmt.Printf("數(shù)據(jù)類型是:%T", number)
//數(shù)據(jù)類型轉(zhuǎn)換string——》int
//空白標(biāo)識符接受err數(shù)值
value, _ := strconv.Atoi(number)
//數(shù)值判斷
fmt.Printf("轉(zhuǎn)換后的數(shù)據(jù)類型是: %T\n", value)
if value > 100 {
fmt.Println("數(shù)值較大")
} else {
fmt.Println("數(shù)值較小")
}
} 


2. Go 語言隨機(jī)數(shù)
go語言中的隨機(jī)數(shù)應(yīng)該說是偽隨機(jī)
math/rand 包實(shí)現(xiàn)了偽隨機(jī)數(shù)生成器
在go語言中隨機(jī)數(shù)需要設(shè)置種子,如果不設(shè)置種子,隨機(jī)數(shù)每次運(yùn)行的結(jié)果相同
默認(rèn)種子是1,且相同種子產(chǎn)生的隨機(jī)數(shù)是相同的
為了保證種子不是固定的,使用time這個(gè)包來調(diào)取當(dāng)前時(shí)間,采用當(dāng)前時(shí)間的納秒作為種子來生成隨機(jī)數(shù)
示例
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) 左閉右開區(qū)間 [0,10)
fmt.Println(value)
}
}
執(zhí)行結(jié)果如下
0
4
4
4
5
8
9
4
4
7
這里有二個(gè),不能選錯(cuò)

//猜商品價(jià)格,商品高低,商品價(jià)格隨機(jī)生成[0-300)
//如果你輸入的價(jià)格大于商品價(jià)格則提示價(jià)格過高
//如果你輸入的價(jià)格低于商品價(jià)格提示價(jià)格過低,直到猜中商品價(jià)格為止,并統(tǒng)計(jì)猜的次數(shù)
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("請輸入價(jià)格:")
fmt.Scan(&price)
switch {
case price == real_price:
count++
fmt.Println("恭喜你猜對價(jià)格,價(jià)格為:", real_price)
goto TAG
case price > real_price:
count++
fmt.Println("價(jià)格過高,請重新輸入!")
continue
default:
count++
fmt.Println("價(jià)格過低,請重新輸入!")
continue
}
}
TAG:
fmt.Println("總共猜的次數(shù)為:", count)
}
//終端交互結(jié)果如下
PS D:\goproject\src\dev_code\test01\example4\main> go run .\main.go
請輸入價(jià)格:
100
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
200
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
280
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
270
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
260
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
250
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
240
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
245
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
243
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
242
恭喜你猜對價(jià)格,價(jià)格為: 242
總共猜的次數(shù)為: 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("請輸入價(jià)格:")
fmt.Scan(&price)
if price == real_price {
count++
fmt.Println("恭喜猜對價(jià)格!商品的價(jià)格為:", real_price)
break
}
if price > real_price {
count++
fmt.Println("價(jià)格過高,請重新輸入!")
} else {
count++
fmt.Println("價(jià)格過低,請重新輸入!")
continue
}
}
fmt.Println("總共猜了:", count, "次!")
}
//輸出結(jié)果
請輸入價(jià)格:
100
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
500
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
400
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
300
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
200
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
150
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
140
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
130
價(jià)格過高,請重新輸入!
請輸入價(jià)格:
122
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
126
價(jià)格過低,請重新輸入!
請輸入價(jià)格:
128
恭喜猜對價(jià)格!商品的價(jià)格為: 128
總共猜了: 11 次!
3. 高并發(fā)輸入解析
大致流程如下
用戶往程序控制臺進(jìn)行輸入,當(dāng)出現(xiàn)高并發(fā)讀寫的時(shí)候,所以的線程不一定能處理過來,這時(shí)候就把請求收納到緩沖區(qū)中;
使用bufio.NewReader(os.Stdin)可以建立緩沖區(qū),并把數(shù)據(jù)從控制臺拿到緩沖區(qū));
使用ReadLine()方式把數(shù)據(jù)從緩沖區(qū)拿到程序中,判斷數(shù)據(jù)中的是否存在報(bào)錯(cuò),有錯(cuò)誤交給Err()處理并輸出報(bào)錯(cuò)信息,而正確的字符串則提取出來給程序去使用。
示例:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("請輸入內(nèi)容:")
str1 := getInput()
fmt.Println(str1)
}
//緩沖區(qū)控制臺寫入
func getInput() string {
//bufio 緩沖區(qū)從控制臺中讀取輸入的信息,緩沖區(qū)名為in
in := bufio.NewReader(os.Stdin)
//從緩沖區(qū)讀取字符串信息
str, _, err := in.ReadLine()
if err != nil {
return err.Error()
}
return string(str)
}
終端輸出結(jié)果如下
請輸入內(nèi)容:
hello
hello
示例
使用Scan()相比于上面的方法,可以自定義報(bào)錯(cuò)信息,代碼更簡潔方便
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("請輸入內(nèi)容:")
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
}
結(jié)果如下
請輸入內(nèi)容:
hello
hello
到此這篇關(guān)于Go語言實(shí)現(xiàn)控制臺輸入&生成隨機(jī)數(shù)詳解的文章就介紹到這了,更多相關(guān)Go語言輸入生成隨機(jī)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go操作Kafka的實(shí)現(xiàn)示例(kafka-go)
本文介紹了使用kafka-go庫在Go語言中與Kafka進(jìn)行交互,涵蓋了kafka-go的安裝、API使用、消息發(fā)送與消費(fèi)方法,以及如何通過DockerCompose快速搭建Kafka環(huán)境,文章還比較了其他兩個(gè)常用的Kafka客戶端庫,感興趣的可以了解一下2024-10-10
使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟
Go語言是采用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發(fā),大家可以根據(jù)自己的喜好自行選擇,下面這篇文章主要給大家介紹了關(guān)于使用VSCODE配置GO語言開發(fā)環(huán)境的完整步驟,需要的朋友可以參考下2022-11-11
golang?db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)
這篇文章主要介紹了golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
分布式架構(gòu)在Go語言網(wǎng)站的應(yīng)用
分布式架構(gòu)是目前應(yīng)對高流量、高并發(fā)的重要解決方案,分布式架構(gòu)的核心思想是分而治之,將單臺服務(wù)器的資源劃分為多臺服務(wù)器進(jìn)行協(xié)同完成,分布式架構(gòu)應(yīng)用于Go語言網(wǎng)站中既能提升服務(wù)速度,又能降低了服務(wù)器宕機(jī)的風(fēng)險(xiǎn)2024-01-01
利用go-kit組件進(jìn)行服務(wù)注冊與發(fā)現(xiàn)和健康檢查的操作
這篇文章主要介紹了利用go-kit組件進(jìn)行服務(wù)注冊與發(fā)現(xiàn)和健康檢查的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

