首頁 > 軟體

Go語言實現控制檯輸入&生成亂數詳解

2022-05-26 14:00:04

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("轉換後的資料型別是: %Tn", 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: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()處理並輸出報錯資訊,而正確的字串則提取出來給程式去使用。

範例:

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 

到此這篇關於Go語言實現控制檯輸入&生成亂數詳解的文章就介紹到這了,更多相關Go語言輸入生成亂數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com