Go语言的数据输入常用方式

Go语言的数据输入常用方式

目录

      • Go语言的数据输入常用方式
        • 一、fmt包
          • 1.Scanf
          • 2.Scanln
          • 3.Scan
        • 二、bufio包
          • 1.ReadByte
          • 2.ReadBytes
          • 3.ReadLine
          • 4.ReadRune
          • 5.ReadString
          • 三、青训营第一个作业

一、fmt包
1.Scanf

​ 这个和C语言的输入基本差不多,需要使用占位符,如下:

%v %d %f %t %c %s %T %o %x和%X %e和%E
按数据原格式 十进制整形 单精度浮点型(float32) 布尔型 字符型 字符串型 变量的数据类型 八进制 十六进制,前者的字母用大写表示,后者用小写表示 科学计数法
package main

import "fmt"

func main() {
	var a int
	var b float64
	var str string
	var c bool
	//注意:在go语言中字符类型不是char,而是byte
	var d byte
    
    //测试的是这个
    fmt.Scanf("%d %f %s %t %c", &a, &b, &str, &c, &d)
	fmt.Printf("%d %f %s %t %c", a, b, str, c, d)
    
	//输入整型
	fmt.Scanf("%d", &a)
	fmt.Printf("整型:%d", a)
	//输入浮点型
	fmt.Scanf("%f", &b)
	fmt.Printf("浮点型:%f", b)
	//输入字符串
	fmt.Scanf("%s", &str)
	fmt.Printf("字符串:%s", str)
	//输入布尔类型
	fmt.Scanf("%t", &c)
	fmt.Printf("布尔:%t", c)
	//输入字符类型
	fmt.Scanf("%c", &d)
	fmt.Printf("字符:%c", d)
}

Go语言的数据输入常用方式_第1张图片

2.Scanln

​ 这个函数输入时是一行一行的读取数据

使用多行读入

package main

import "fmt"

func main() {
	var a int
	var b float64
	var str string
	var c bool

	fmt.Scanln(&a)
	fmt.Scanln(&b)
	fmt.Scanln(&str)
	fmt.Scanln(&c)
	fmt.Printf("%d %f %s %t", a, b, str, c)
}

Go语言的数据输入常用方式_第2张图片

使用Scanln一行输入

package main

import "fmt"

func main() {
	var a int
	var b float64
	var str string
	var c bool

	fmt.Scanln(&a, &b, &str, &c)
	fmt.Printf("%d %f %s %t", a, b, str, c)
}

Go语言的数据输入常用方式_第3张图片

3.Scan

​ Scan的用法和Scanln差不多,可以写在一行

package main

import "fmt"

func main() {
	var a int
	var b float64
	var c bool
	var str string
	//使用scan输入
	fmt.Scan(&a, &b, &c, &str)
	fmt.Printf("%d %.2f %t %s", a, b, c, str)
}

Go语言的数据输入常用方式_第4张图片

二、bufio包

​ bufio包是对IO的封装,可以操作文件等内容,同样可以用来接收键盘的输入,此时对象不是文件,而是os.Stdin,也就是标准输入设备。

​ bufio包含了Reader、Writer、Scanner等对象,封装了很多对IO内容处理方法,但要从键盘输入,使用Reader对象(或Scanner对象)。

1.ReadByte

​ 会读取输入的一个字符,如果输入字符串,也只会读取第一个字符。

方法参数及返回值

//返回byte类型和error
func (b *Reader) ReadByte() (byte, error)

代码

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	//创建一个reader对象
	reader := bufio.NewReader(os.Stdin)

	//使用Reader对象进行读取数据
	//ReadByte:用来结仇一个byte类型
	res, err := reader.ReadByte()
	if err != nil {
		//说明有问题
		panic("出问题了!")
	} else {
		//打印数据,会打印出数据的ASCII码
		//如果读一行只会显示第一个字符的ASCII码
		fmt.Println(res)
		//将ASCII码转为string类型
		fmt.Println(string(res))
	}
}

注意

  • 只读一个字符
  • 若输入字符串,则只读第一个字符
2.ReadBytes

​ 需要byte类型参数,当读取值遇到这个byte类型参数时,则会停止读取,返回byte参数及之前的字符。

方法参数及返回值

//返回值:[]byte,error   []byte:即可以读多个字符
//参数:byte 输入要停止返回的byte类型参数
func (b *Reader) ReadBytes(delim byte) ([]byte, error)

代码

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	//创建一个reader对象
	reader := bufio.NewReader(os.Stdin)

	//ReadBytes
	//当读取到‘\n’时,即一行完
	res, err := reader.ReadBytes('\n')
	if err != nil {
		panic("出错咯~~")
	} else {
		fmt.Println(res)
        //转换成字符串输出
		fmt.Println(string(res))
	}
}

结果
Go语言的数据输入常用方式_第5张图片

注意

  • Reader可以接收空格,这也是和fmt最大的不同
3.ReadLine

​ 是一个低水平的行数据读取原语,大多数人会使用Read.bytes(‘\n’)或Read.String(‘\n’)代替,或者使用Scanner。

方法参数及返回值

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
4.ReadRune

​ 用来处理unicode或utf-8字符,该函数可以接收该类字符,返回接受字符的rune值、size大小(即字节数)以及error。

方法参数及返回值

//读数据,并且将其转换为切片,可以返回字符长度
func (b *Reader) ReadRune() (r rune, size int, err error)

代码

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	//创建一个reader对象
	reader := bufio.NewReader(os.Stdin)

	//ReadRune
	res, size, err := reader.ReadRune()
	if err != nil {
		panic("出错咯~~")
	} else {
		//输出rune值
		fmt.Println(res)
		//输出字节数
		fmt.Println(size)
	}
}

结果
Go语言的数据输入常用方式_第6张图片

5.ReadString

​ 接收以byte类型结束之前的(包括参数)的字符串

方法参数及返回值

func (b *Reader) ReadString(delim byte) (string, error)

代码

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	//创建一个reader对象
	reader := bufio.NewReader(os.Stdin)

	//ReadString
	str, err := reader.ReadString('b')
	if err != nil {
		panic("出错咯~~")
	} else {
		fmt.Println(str)	
    }
}

结果
在这里插入图片描述

三、青训营第一个作业
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	//设置一个最大值
	maxNum := 100
	//随机生成一个数,并且其最大数为100
	//注意:在生成随机数之前,需要在rand.seed()中放入时间戳,不然会使随机数始终是一样的
	rand.Seed(time.Now().UnixNano())
	//生成一个随机数
	random := rand.Intn(maxNum)

	//使用for死循环
	var val int
	for {
		fmt.Println("请输入您猜测的数字:")
		//输入数字,这个也是需要改进的地方
		fmt.Scanf("%d\n", &val)
		if val < random {
			fmt.Println("您猜测的数字太小了,请重新猜测:")
		} else if val > random {
			fmt.Println("您猜测的数字太大了,请重新猜测:")
		} else {
			//猜测成功
			fmt.Println("恭喜您,猜测成功!")
			break
		}
	}
}

你可能感兴趣的:(golang,算法,c语言)