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 

到此这篇关于Go语言实现控制台输入&生成随机数详解的文章就介绍到这了,更多相关Go语言输入生成随机数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • go语言返回1-99之间随机数的方法

    本文实例讲述了go语言返回1-99之间随机数的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "math/rand" ) func main() {     max := big.NewInt(100)     i, err := rand.Int(rand.Reader, max) } 希望本文所述对大家的Go语言程序设计有所帮助.

  • golang生成指定位数的随机数的方法

    1.随机数 随机数,是使用一个确定性的算法计算出来随机数序.在程序开发中经常需要产生随机数,如随机数验证码登陆.作为唯一身份标识数据等等. 2.rand库 golang中产生随机数主要有两个包,分别是"math/rand"和"crypto/rand". "math/rand"的rand包实现了伪随机数生成器. "crypto/rand"的rand包实现了用于加解密的更安全的随机数生成器. 3.生成指定位数随机数 以生成六位随机

  • Go语言生成随机数的方法

    本文实例讲述了Go语言生成随机数的方法.分享给大家供大家参考.具体实现方法如下: golang生成随机数可以使用math/rand包 复制代码 代码如下: package main        import (     "fmt"     "math/rand" )        func main() {     for i:=0; i<10; i++ {         fmt.Println(rand.Intn(100))     } } 发现这种情况

  • 利用Golang生成整数随机数方法示例

    php随机数 生成一个给定范围的随机数,用 PHP 就太简单不过了,而且可以指定从负数到正整数的范围,如: <?php echo mt_rand(-988, 888); 这样就随机生成 -988 到 888 的随机数. 使用 Go 就要稍微麻烦一点.以下两个函数分别是生成一个最大范围内随机整数,和生成一个区间范围的随机整数: 生成一个最大范围内随机数 一定要给一个时间戳的种子,否则每次生成都是一样的值.这里就是生成 [0,100) 的随机数. func GenerateRandnum() int

  • go语言生成随机数和随机字符串的实现方法

    目录 生成随机数 生成随机字符串 生成随机数 随机数的生成是计算机科学的一个研究领域,同时也是一种艺术.这是因为计算机是纯粹的逻辑机器,所以使用计算机生成随机数异常困难! 你可以用 math/rand 包来生成随机数.开始生成随机数之前首先需要一个种子,种子用于整个过程的初始化,它相当重要.因为如果你每次都用同样的种子初始化,那么就总是会得到相同的随机数序列.这意味着每个人都可以重新生成同一个序列,那这个序列就根本不能再算是随机的了! 我们将用来生成随机数的程序名为 randomNumbers.

  • GoLang 中的随机数的示例代码

    随机数我们都知道,就是计算机通过某种算法,"随机"的生成一个数字.很多编程语言都有内置的方法来生成随机数,那么 GoLang 中是怎样一种情况呢? 伪随机数 我们都知道"随机数"在现实生活中的概念,可能你随手抛一个硬币,就可以说其结果是随机的,但是在计算机中要确定一个"随机数"真的是"随机数",那可是有标准的,不是你随随便便说是就是. 根据密码学原理,要想对一个"随机数"进行随机性检验有以下几个标准: 统计

  • Go语言实现控制台输入&生成随机数详解

    1. 不同基础类型之间的转化 对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化. 其中最常用的数值转化函数是Atoi和ltoa Atoi 方法可以将字符串类型的数值直接转化为int类型的数值,而 ltoa 可以将 int 类型的数值转化为string类型的值. 示例:控制台输入一个数值,进行数据大小的比较 package main import ( "fmt" "strconv" ) func main() {

  • Python生成随机数详解流程

    目录 一.随机数种子 二.生成随机数 1.random() 2.ranint(a,b) 3.randrange(start,stop[,step]) 4.getrandbits(k) 三.生成随机序列 1.choice(seq) 2.samplex(序列,k) 3.shuffle(x[,random]) 一.随机数种子 为什么要提出随机数种子呢?咱们前面提到过了,随机数均是模拟出来的, 想要模拟的比较真实,就需要变换种子函数内的数值,一般以时间戳为随机函数种子. 例如以下案例,将随机数种子固定的

  • Go语言排序算法之插入排序与生成随机数详解

    前言 排序,对于每种编程语言都是要面对的.这里跟大家一起分享golang实现一些排序算法,并且说明如何生成随机数.下面话不多说了,来一起看看详细的介绍吧. 经典排序算法 算法的学习非常重要,是检验一个程序员水平的重要标准.学习算法不能死记硬背,需要理解其中的思想,这样才能灵活应用到实际的开发中. 七大经典排序算法 插入排序 选择排序 冒泡排序 希尔排序 归并排序 堆排序 快速排序 插入排序 先考虑一个问题:对于长度为n的数组,前n-1位都是递增有序的,如何排序? 1.从第1位至第n-1位遍历数组

  • Python中random模块生成随机数详解

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniform random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成的随机数n: a <= n <= b.如果 a <

  • java中生成任意之间数的随机数详解

    这篇文章主要介绍了java中生成任意之间数的随机数详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 public static int cssjs(int a,int b) { Random rand=new Random(); int zhi; zhi=rand.nextInt(b)%(b-a+1)+a; return zhi; } 我们观察其Random对象的nextInt(int)方法,发现这个发现这个方法将生成 0 ~ 参数之间随机取

  • 易语言的输入字类型详解

    在程序中书写输入字时,可以使用一个半角符号来引导该输入字,以指定其类型.各输入字的类型引导符号为: 首拼及全拼输入字: 分号(";") 如: ;qz(1.23) 或 ;quzheng(1.23) 双拼输入字: 冒号(":") 如: :quvg(1.23) 英文输入字: 单引号(" '") 如: 'int(1.23) 系统具有一个当前默认输入法状态,如果某输入字前没有加上类型引导符号,则默认是属于该输入法的输入字.系统安装完毕后,当前默认输入法为&

  • C语言实现爆炸展开的扫雷详解

    目录 游戏介绍 游戏功能实现 1.主菜单: 2.初始化雷盘 3.打印雷盘 4.布置雷 5.玩家开始排查雷 6.小菜单 7.排查位置周围的八个坐标有几个雷 8.使用递归爆炸式展开 9.标记功能 10.取消标记功能 完整代码 1.game.c 2.test.c 3.game.h 游戏介绍 首先,我们来说基础版的扫雷游戏有什么功能: 1.打印菜单,由玩家选择玩游戏或者是退出游戏. 2.打印雷盘,让玩家知道我们的雷盘是什么样子的,从而让玩家知道排雷的时候哪个位置对应着哪个坐标. 3.玩家开始排雷,并在排

  • C语言实现“幸运数”的实例详解

    C语言实现"幸运数"的实例详解 1.题目: 标题:幸运数 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,-. 1 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 -. 把它们缩紧,重新记序,为: 1 3 5 7 9 -. .这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去.注意,是序号位置,不是那个数本身能否被3整除!

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • Go语言学习之数组的用法详解

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

随机推荐