Go语言中的IO操作及Flag包的用法

一、格式化输入和输出

1.从终端获取用户的输入

fmt.Scanf 空格作为分隔符,占位符和格式化输出的一致

fmt.Scan 从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为分隔符

fmt.Scanln 从终端获取用户的输入,存储在Scanln中的参数里,空格作为分隔符,换行符作为结束

Scanf 例子:

package main

import (
   "fmt"
)

func TestScanf(){
   var a int
   var b string
   var c float32
   fmt.Scanf("%d%s%f",&a,&b,&c)
   fmt.Printf("a=%d b=%s c=%f",a,b,c)
}

func main(){
   TestScanf()
}

结果:

> 111 abvc 111
a=111 b=abvc c=111.000000

这里我们是通过一行输入的,并且是以空格作为分割的,但是如果想通过多行输入,那么在Windows下Scanf可能会存在一个问题,如下:

func TestScanf(){
   var a int
   var b string
   var c float32
   fmt.Scanf("%d",&a)
   fmt.Scanf("%s",&b)
   fmt.Scanf("%f",&c)
   fmt.Printf("a=%d b=%s c=%f",a,b,c)
}

然后我们在windows下面去运行一下

由上面的我们可以看到,只接受到了第一个值,第二值输入之后回车,发现b和c都没有值。主要是由于Windows下面,回车会 自动加上 \r\n。

如果想要正确的获取这个值,可以修改如下:在每一个scanf上面都加上“\n”

func TestScanf(){
   var a int
   var b string
   var c float32
   fmt.Scanf("%d\n",&a)
   fmt.Scanf("%s\n",&b)
   fmt.Scanf("%f\n",&c)
   fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}

Scan例子:

func TestScan(){
   var a int
   var b string
   var c float32
   fmt.Scan(&a,&b,&c)
   fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}

Scanln例子:

func TestScanln(){
   var a int
   var b string
   var c float32
   fmt.Scanln(&a)
   fmt.Scanln(&b)
   fmt.Scanln(&c)
   fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}

2.从字符串中获取

上面是从终端输入的字符串中提取数据,然后还可以从一个已经存在的字符串中提取。

fmt.Sscanf 空格作为分隔符,占位符和格式化输出的一致

fmt.Sscan 从字符串获取用户的输入,存储在Scanln中的参数里,空格和换行符作为分隔符

fmt.Sscanln 从字符串获取用户的输入,存储在Scanln中的参数里,空格作为分隔符,换行符作为结束

下面的例子就是从str中提取整数、字符串和浮点数

func TestSscanf(){
   var a int
   var b string
   var c float32
   str := "123 hello 111.1"
   fmt.Sscanf(str,"%d%s%f",&a,&b,&c)
   fmt.Printf("a=%d b=%s c=%f \n",a,b,c)
}

备注:一定要传地址进去,否则修改是变量的副本,也就是说读取不到用户的输入了。

3.从文件中获取

fmt.Fscanf 空格作为分隔符,占位符和格式化输出的一致

fmt.Fscan 从文件获取用户的输入,存储在Scanln中的参数里,空格和换行符作为分隔符

fmt.Fscanln 从文件获取用户的输入,存储在Scanln中的参数里,空格作为分隔符,换行符作为结束

4.终端输入输出的原理

终端相当于是一个文件, 所以可以用 os.stdin 和os.stdout 作为输入和输出。查看源码可以看到他们其实就是*File

二、bufio包的使用

为了完善文件本身读取性能差的问题,增加了缓冲区操作。

package main

import (
   "bufio"
   "os"
)

func main() {
   reader := bufio.NewReader(os.Stdin)
   buf, _ := reader.ReadBytes('\n')
   println((string)(buf))
}

备注:这里可以看到NewReader的参数是一个io.Reader接口 , os.Stdin则是返回一个*File ,由于File实现了io.Reader的Read方法,所以可以接受File作为参数(鸭子类型)。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Go语言的IO库那么多纠结该如何选择

    在计算机和信息技术领域里 I/O 这个术语表示输入 / 输出 ( 英语:Input / Output ) ,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统与外部之间的通信.输入是系统接收的信号或数据,输出则是从其发送的信号或数据. 在Go语言中涉及 I/O 操作的内置库有很多种,比如: io 库, os 库, ioutil 库, bufio 库, bytes 库, strings 库等等.拥有这么多内置库是好事,但是具体到涉及 I/O 的场景我们应该选择哪个库呢?

  • Go语言中使用flag包对命令行进行参数解析的方法

    flag flag 是Go 标准库提供的解析命令行参数的包. 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等:并返回一个相应类型的指针. flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上. 自定义flag 只要实现flag.Value接口即可: type Value interface { String() string Set(string)

  • 详解Go语言中io/ioutil工具的使用

    目录 读取文件 写文件 读取文件夹下所有文件信息 创建临时文件和临时文件夹 拷贝文件 小结 学习笔记,写到哪是哪. 接着上一篇,我们看看io/ioutil工具如何使用,简化文件操作. 读取文件 读取文件可以使用ReadAll方法或者ReadFile方法. ReadAll方法样例代码如下 //读取文件ReadAll func IoUtilRead1() { _file, _e := os.Open("./test.txt") if _e != nil { fmt.Println(_e)

  • Go语言库系列之flag的具体使用

    背景 终端(命令行)操作是程序员的必备技能,但是你知道怎么通过golang制作出如下命令吗? $ flag girl -h Usage of girl: -height int 身高 (default 140) $ flag girl --height 170 恭喜你获得了身高 170 的女朋友 极速上手 整个实现非常简单,只需要5个步骤 第一步,引库 import "flag" 第二步,定义变量 定义该变量的作用是存储命令行参数传来的值 var height int 第三步,配置命令

  • Golang开发命令行之flag包的使用方法

    目录 1.命令行工具概述 2.flag包介绍 3.flag包命令行参数的定义 4.flag包命令行参数解析 5.flag包命令行帮助 6.flag定义短参数和长参数 7.示例 1.命令行工具概述 日常命令行操作,相对应的众多命令行工具是提高生产力的必备工具,鼠标能够让用户更容易上手,降低用户学习成本. 而对于开发者,键盘操作模式能显著提升生产力,还有在一些专业工具中, 大量使用快捷键代替繁琐的鼠标操作,能够使开发人员更加专注于工作,提高效率,因为键盘操作模式更容易产生肌肉记忆 举个栗子:我司业务

  • 谈谈对Golang IO读写的困惑

    前言 Golang的IO读写提供了很多种方式,目前本人知道的有io库.os库.ioutil库.bufio库.bytes/strings库等. 虽然库多是一件好事,意味着选择性多,但让我困惑的一点是:什么场景下该用哪个库? 为什么? 在给出结论前,我先想给出Golang内置IO库的项目结构,主要方便理解和引用: # 只列举了核心的目录及文件 src: - bufio - bufio.go - bytes - buffer.go - reader.go - io - ioutil - ioutil.

  • Go语言中io包核心接口示例详解

    目录 前言 Reader Writer Closer Seeker 组合接口 总结 前言 IO 操作是我们在编程中不可避免会遇到的,例如读写文件,Go语言的 io 包中提供了相关的接口,定义了相应的规范,不同的数据类型可以根据规范去实现相应的方法,提供更加丰富的功能. Go 语言提倡小接口 + 接口组合的方式,来扩展程序的行为以及增加程序的灵活性.io代码包恰恰就可以作为这样的一个标杆,它可以成为我们运用这种技巧时的一个参考标准.io包中包含了大量接口,本篇文章我们就先来学习四个核心接口以及对应

  • golang flag简单用法

    通过一个简单的实例,来让大家了解一下golang flag包的一个简单的用法 package main import ( "flag" "strings" "os" "fmt" ) var ARGS string func main() { var uptime *bool = new(bool) flag.BoolVar(uptime,"u", false, "print system upti

  • Go语言中的IO操作及Flag包的用法

    一.格式化输入和输出 1.从终端获取用户的输入 fmt.Scanf 空格作为分隔符,占位符和格式化输出的一致 fmt.Scan 从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为分隔符 fmt.Scanln 从终端获取用户的输入,存储在Scanln中的参数里,空格作为分隔符,换行符作为结束 Scanf 例子: package main import ( "fmt" ) func TestScanf(){ var a int var b string var c flo

  • 详解C语言中的ttyname()函数和isatty()函数的用法

    C语言ttyname()函数:返回一终端机名称 头文件: #include <unistd.h> 定义函数: char * ttyname(int desc); 函数说明:如果参数desc 所代表的文件描述词为一终端机, 则会将此终端机名称由一字符串指针返回, 否则返回NULL. 返回值:如果成功则返回指向终端机名称的字符串指针, 有错误情况发生时则返回NULL. 范例 #include <unistd.h> #include <sys/types.h> #includ

  • C语言中的abs()函数和exp()函数的用法

    C语言abs()函数:求绝对值(整数) 头文件: #include <stdlib.h> 定义函数: int abs (int j); 函数说明:abs()用来计算参数j 的绝对值,然后将结果返回. 返回值:返回参数j 的绝对值结果. 范例 #ingclude <stdlib.h> main(){ int ansert; answer = abs(-12); printf("|-12| = %d\n", answer); } 执行 |-12| = 12 C语言e

  • Golang flag包的具体使用

    目录 入门 demo 运行 demo 解读 flag 包源码 总结 在 Golang 程序中有很多种方法来处理命令行参数.简单的情况下可以不使用任何库,直接处理 os.Args:其实 Golang 的标准库提供了 flag 包来处理命令行参数:还有第三方提供的处理命令行参数的库,比如 Pflag 等.本文将介绍 Golang 标准库中 flag 包的用法.本文的演示环境为 ubuntu 18.04. 入门 demo 在 Go workspace 的 src 目录下创建 flagdemo 目录,并

  • Go语言中io.Reader和io.Writer的详解与实现

    一.前言 也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对io接口的继承关系整天的概貌,原因在于godoc缺省并没有像javadoc一样显示官方库继承关系,这导致了我们对io接口的继承关系记忆不深,在使用的时候还经常需要翻文档加深记忆. 本文试图梳理清楚Go io接口的继承关系,提供一个io接口的全貌. 二.io接口回顾 首先我们回顾一下几个常用的io接口.标准库的实现是将功能细分,每个最小粒度的功能定义成一个接口,然后接口可以组成成更多功能的接口. 最小粒度的接口 typ

  • Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出.flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出 针对上述回答,给出了精准的回答 FileOutPutStream

  • 汇编语言中test和cmp有什么区别

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.下面看下汇编语言中test和cmp有什么区别, 汇编test和cmp区别 看过破解教程,都知道test,cmp是比较关键,可是我一

  • 汇编语言中cmp指令用法笔记与总结

    本文实例讲述了汇编语言中cmp指令用法.分享给大家供大家参考,具体如下: cmp是比较指令,cmp的功能是相当于减法指令,只是不保存结果.cmp指令执行后,将对标志寄存器产生影响.其他相关指令通过识别这些被影响的标志寄存器来得知比较结果. cmp指令格式: cmp  操作对象1,操作对象2 功能: 计算操作对象1 - 操作对象2 但不保存结果,仅仅根据计算结果对标志寄存器进行设置.比如cmp ax,ax  是做ax - ax 的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位. 指令

随机推荐