Go 語言控制檯輸入&生成隨機數

隱姓埋名4869發表於2022-03-23

Go 語言控制檯輸入&生成隨機數

 

1. 不同基礎型別之間的轉化
對於不同的基礎型別之間的轉化,Go 提供了 strconv包。它實現了字串與其他基本資料型別之間的轉化。
其中最常用的數值轉化函式是Atoi和ltoa
Atoi 方法可以將字串型別的數值直接轉化為int型別的數值,而 ltoa 可以將 int 型別的數值轉化為string型別的值。
示例:控制檯輸入一個數值,進行資料大小的比較

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這個包來調取當前時間,採用當前時間的納秒作為種子來生成隨機數

示例

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

  

這裡有二個,不能選錯

 

 

 

//猜商品價格,商品高低,商品價格隨機生成[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()處理並輸出報錯資訊,而正確的字串則提取出來給程式去使用。

示例:

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()相比於上面的方法,可以自定義報錯資訊,程式碼更簡潔方便

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

  

 

相關文章