目录:

  • 格式化输入
  • 格式化输出
  • 终端输入输出背后的原理理
  • bufio包的使用
  • 命令行参数处理理和urfave/cli使用

格式化输入

1、从终端获取⽤用户的输入

格式化输入

fmt.Scan(a …interface{}): 从终端获取⽤用户输入,存储在Scanln中的参数里,空格和换行符作为分隔符

fmt.Scanf(format string, a…interface{}): 格式化输入,空格作为分隔符,占位符和格式化输出一致

fmt.Scanln(a …interface{}): 从终端获取⽤用户输入,存储在Scanln中的参数里,空格作为分隔符,遇到换行符结束

2、终端操作实例

package main
import (
"fmt"
)
var (
firstName, lastName, s string
i int
f float32
input = "56.12 / 5212 / Go"
format = "%f / %d / %s"
)
func main() {
fmt.Println("Please enter your full name: ")
fmt.Scanln(&firstName, &lastName)
// fmt.Scanf("%s %s", &firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) // Hi Chris Naegels
fmt.Sscanf(input, format, &f, &i, &s)
fmt.Println("From the string we read: ", f, i, s)
}

  

3、从字符串中获取输入

fmt.Sscanf(str, format string, a…interface{}): 格式化输入,空格作为分隔符,占位符和格式化输出一致

fmt.Sscan(str string, a …interface{}): 从终端获取⽤用户输入,存储在Scanln中的参数⾥里里,空格和换行符作为分隔符

fmt.Sscanln(str string, a …interface{}): 从终端获取⽤用户输入,存储在Scanln中的参数⾥里里,空格作为分隔符,遇到换行符结束

格式化输出

1、格式化输出

fmt.Println(a …interface{}): 把零个或多个变量量打印到终端, 并换⾏行行
fmt.Printf(format string, a…interface{}): 格式化输出,并打印到终端
fmt.Print(a …interface{}): 把零个或多个变量量打印到终端

2、格式化并返回字符串

fmt.Sprintln(a …interface{}): 把零个或多个变量量按空格进⾏行行格式化并换⾏行行,返回字符串串
fmt.Sprintf(format string, a…interface{}): 格式化并返回字符串串
fmt.Sprint(a …interface{}): 把零个或多个变量量按空格进⾏行行格式化,返回字符串串

终端输入输出背后的原理理

1、终端其实是一个文件

os.Stdin:标准输⼊入的⽂文件实例例,类型为*File
os.Stdout:标准输出的⽂文件实例例,类型为*File
os.Stderr:标准错误输出的⽂文件实例例,类型为*File

2、以文件的方式操作终端

File.Read(b []byte)
File.Write(b []byte)
终端读取:
终端输出:
File.WriteString(str string)

3、从文件获取输入

格式化输入
fmt.Fscan(file, a …interface{}): 从文件获取用户输入,存储在Scanln中的参数里,空格和换行符作为分隔符

fmt.Fscanf(file, format string, a…interface{}): 从文件格式化输入,空格作为分隔符,占位符和 格式化输出一致

fmt.Fscanln(file, a …interface{}): 从文件获取用户输入,存储在Scanln中的参数里,空格作为分隔符,遇到换行符结束

4、格式化输出到文件中
格式化输出
fmt.Fprintln(file, a …interface{}): 把零个或多个变量量写入到文件中, 并换行
fmt.Fprintf(file, format string, a…interface{}): 格式化输出,并写⼊入到文件中
fmt.Fprint(file, a …interface{}): 把零个或多个变量量写入到文件

bufio包的使用

1、带缓冲区的读写

package main
import (
"bufio"
"fmt"
"os"
)
var inputReader *bufio.Reader
var input string
var err error
func main() {
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("Please enter some input: ")
input, err = inputReader.ReadString('\n')
if err == nil {
fmt.Printf("The input was: %s\n", input)
}
}

  

命令行参数处理理和urfave/cli使用

1、os.Args命令行参数的切片

package main
import (
"fmt"
"os"
)
func main() {
who := "Alice"
if len(os.Args) > 1 {
who += strings.Join(os.Args[1:], " ")
}
fmt.Println("Good Morning", who)
}

  

2、使⽤用flag包获取命令行参数

package main
import (
"flag"
"fmt"
)
func parseArgs() {
flag.IntVar(&length, "l", 16, "-l ⽣成密码的长度")
flag.StringVar(&charset, "t", "num",
`-t 制定密码⽣成的字符集,
num:只使⽤数字[0-9],
char:只使⽤英⽂字母[a-zA-Z],
mix: 使⽤数字和字母,
advance:使⽤数字、字母以及特殊字符`)
flag.Parse()
}
func main() {
parseArgs()
}

  

3、urfave/cli包的使用

package main
import (
"fmt"
"os"
"github.com/urfave/cli"
)
func main() {
app := cli.NewApp()
app.Name = "greet"
app.Usage = "fight the loneliness!"
app.Action = func(c *cli.Context) error {
fmt.Println("Hello friend!")
return nil
}
app.Run(os.Args)
}

  

4、获取命令行参数

package main
import (
"fmt"
"os"
"github.com/urfave/cli"
)
func main() {
app := cli.NewApp()
app.Action = func(c *cli.Context) error {
fmt.Printf("Hello %q", c.Args().Get(0))
return nil
}
app.Run(os.Args)
}

  

5、获取选项参数

package main
import (
"fmt"
"os"
"github.com/urfave/cli"
)
func main() {
var language string
var recusive bool
app := cli.NewApp()
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "lang, l",
Value: "english",
Usage: "language for the greeting",
Destination: &language,
},
cli.BoolFlag{
Name: "recusive, r",
Usage: "recusive for the greeting",
Destination: &recusive,
},
}
app.Action = func(c *cli.Context) error {
var cmd string
if c.NArg() > 0 {
cmd = c.Args()[0]
fmt.Println("cmd is ", cmd)
}
fmt.Println("recusive is ", recusive)
fmt.Println("language is ", language)
return nil
}
app.Run(os.Args)
}

  

【原创】go语言学习(十四)IO操作1的更多相关文章

  1. Dart语言学习(十四) Dart泛型

    什么是泛型? 通俗理解:泛型就是解决 类 接口 方法的复用性.以及对不特定数据类型的支持(类型校验) 如下代码,只能返回string类型的数据 String getData(String value) ...

  2. Git 学习(四)操作修改和版本穿梭

    Git 学习(四)操作修改和版本穿梭 之前的章节,已介绍了本地Git库创建.暂存区增.删.改,以及提交版本库:可回顾下命令操作: git add 和 git commit. 光有之前章节的操作,Git ...

  3. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  4. Docker学习(四): 操作容器

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  5. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  6. Linux学习记录--文件IO操作相关系统编程

    文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...

  7. 强化学习(十四) Actor-Critic

    在强化学习(十三) 策略梯度(Policy Gradient)中,我们讲到了基于策略(Policy Based)的强化学习方法的基本思路,并讨论了蒙特卡罗策略梯度reinforce算法.但是由于该算法 ...

  8. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  9. MYSQL数据库学习十四 存储过程和函数的操作

    14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...

  10. 【原创】go语言学习(四)流程控制

    目录: 1.if else语句块 2.for语句 3.switch语句 if else语句块 1.基本语法 if condition { //do something } if statement; ...

随机推荐

  1. Spring Cloud Alibaba学习笔记(9) - RocketMQ安装与RocketMQ控制台

    搭建RocketMQ 系统环境准备 64位操作系统,推荐使用Linux.Unix.MacOS 64位 JDK1.8+ Maven 3.2.x 适用于Broker服务器的4g +可用磁盘 下载与搭建 下 ...

  2. hdu 2132... 被基本问题考住了。。

    Problem Description We once did a lot of recursional problem . I think some of them is easy for you ...

  3. 在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键)

    原文:在论坛中出现的比较难的sql问题:10(删除多表中的同一个外键) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  4. C# 使用Berkeley DB

    Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间.简称BDB Berkeley DB是嵌入式键值数据库库,为应用程序提供可扩展的高性能数据管理服务. Berkeley DB ...

  5. NRF52832 Mesh调试,使其同时支持串口打印和RTT打印

    查看开发环境里面,是否有这个文件,如果没有你的话,则添加文件. 然后要在sdk_config.h中添加使能 然后打开刚才添加的文件retarget.c,主意里面这些地方 这里它进行判断,要么使用RTT ...

  6. iOS退出APP

    强制退出有四种: exit(); abort(); assert(); 主动制造一个崩溃: exit() 1.附加了关闭打开文件与返回状态码给执行环境,并调用你用atexit注册的返回函数: 2.警告 ...

  7. iOS-CGContextRef

    图形上下文(Graphics Context)---绘制目标 需要在iOS应用程序的屏幕上进行绘制时,需要先定义一个UIView类,并实现它的drawRect:方法,当启动程序时,会先调用loadVi ...

  8. python3之面向对象编程理解

    面向对象主要有三个特征:封装,继承,多态度. 一.封装 定义类语 class Animal(): class为定义类的关键字,后面跟名字(): python命名规范建议:类一般首字母单词大写,属性变量 ...

  9. Codeforces Round #510 (Div. 2) C. Array Product

    题目 题意: 给你n个数,有两种操作,操作1是把第i个位置的数删去, 操作2 是把 a[ j ]= a[ i ]* a[ j ],把a[ i ]删去 .n-1个操作以后,只剩1个数,要使这个数最大 . ...

  10. linux网络编程之posix线程(一)

    今天继续学习posix IPC相关的东东,消息队列和共享内存已经学习过,接下来学习线程相关的知识,下面开始: [注意]:创建失败这时会返回错误码,而通常函数创建失败都会返回-1,然后错误码会保存在er ...