• 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

      

     

  • 相关阅读:
    TC4056A 1A线性锂离子电池充电器芯片IC
    2022年03月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试
    Redis 非关系型数据库学习(一) ---- Redis 的安装
    一.计算机系统概述
    敏感词检测库ToolGood.Words中 WordsHelper类使用简介
    【Node访问MongoDB数据库】
    如何求候选码、属性集的闭包
    04 `Linux`的VIM
    CNN学习笔记
    支付宝支付&内网穿透
  • 原文地址:https://www.cnblogs.com/lvrui/p/16046366.html