Go語言實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(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類型的值。
示例:控制臺(tái)輸入一個(gè)數(shù)值,進(jìn)行數(shù)據(jù)大小的比較
package main import ( "fmt" "strconv" ) func main() { var number string fmt.Println("請輸入一個(gè)整數(shù):") //控制臺(tái)輸入,&指定一個(gè)地址 fmt.Scan(&number) fmt.Println("數(shù)值是: ", number) fmt.Printf("數(shù)據(jù)類型是:%T", number) //數(shù)據(jù)類型轉(zhuǎn)換string——》int //空白標(biāo)識(shí)符接受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ā)輸入解析
大致流程如下
用戶往程序控制臺(tái)進(jìn)行輸入,當(dāng)出現(xiàn)高并發(fā)讀寫的時(shí)候,所以的線程不一定能處理過來,這時(shí)候就把請求收納到緩沖區(qū)中;
使用bufio.NewReader(os.Stdin)可以建立緩沖區(qū),并把數(shù)據(jù)從控制臺(tái)拿到緩沖區(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ū)控制臺(tái)寫入 func getInput() string { //bufio 緩沖區(qū)從控制臺(tái)中讀取輸入的信息,緩沖區(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)控制臺(tái)輸入&生成隨機(jī)數(shù)詳解的文章就介紹到這了,更多相關(guān)Go語言輸入生成隨機(jī)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言的結(jié)構(gòu)體還能這么用?看這篇就夠了
這篇文章主要為大家詳細(xì)介紹了Go語言結(jié)構(gòu)體的各個(gè)知識(shí)點(diǎn),最后還介紹了空結(jié)構(gòu)體的3種妙用。文中的示例代碼講解詳細(xì),希望對大家有所幫助2023-02-02Golang使用ttl機(jī)制保存內(nèi)存數(shù)據(jù)方法詳解
ttl(time-to-live) 數(shù)據(jù)存活時(shí)間,我們這里指數(shù)據(jù)在內(nèi)存中保存一段時(shí)間,超過期限則不能被讀取到,與Redis的ttl機(jī)制類似。本文僅實(shí)現(xiàn)ttl部分,不考慮序列化和反序列化2023-03-03Golang 實(shí)現(xiàn) RTP音視頻傳輸示例詳解
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)RTP音視頻傳輸?shù)氖纠斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07淺析Golang切片截取功能與C++的vector區(qū)別
這篇文章主要介紹了Golang中切片的截取功能與C++中的vector有什么區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg的處理方法
這篇文章主要介紹了golang?實(shí)現(xiàn)?pdf?轉(zhuǎn)高清晰度?jpeg,下面主要介紹Golang 代碼使用方法及Golang PDF轉(zhuǎn)JPEG的詳細(xì)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10