目录:

  • 格式化输入
  • 格式化输出
  • 终端输入输出背后的原理理
  • 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. AngularJS在IE下页面缓存问题

    问题: 在使用AngularJS发出请求(GET)获取服务端数据,然后再绑定到页面中,你会发现在IE中总是显示原来的数据结果.这时候我们就会知道,IE做了缓存. 解决办法: 我们可以在AngularJ ...

  2. tslint 忽略格式检查

    // tslint:disable——忽略该行以下所有代码出现的错误提示,可以在文件首行添加达到忽略整个文件的格式提示 // tslint:enable——当前ts文件重新启用tslint// tsl ...

  3. jQuery AJAX基础

    一.JSON 定义:             JSON(JavaScript Object Notation, JS对象标记)是一种轻量级的数据交换格式.         它基于 ECMAScript ...

  4. English-手机销售英文场景

    http://www.engpx.com/news/18216.html https://wenku.baidu.com/view/d67a103203768e9951e79b89680203d8ce ...

  5. fastjson反序列化漏洞研究(上)

    前言 最近护网期间,又听说fastjson传出“0day”,但网上并没有预警,在github上fastjson库中也有人提问关于fastjson反序列化漏洞的详情.也有人说是可能出现了新的绕过方式.不 ...

  6. PX4/Pixhawk uORB

    PX4/Pixhawk的软件体系结构主要被分为四个层次 应用程序的API:这个接口提供给应用程序开发人员,此API旨在尽可能的精简.扁平及隐藏其复杂性 应用程序框架:这是为操作基础飞行控制的默认程序集 ...

  7. Jerry Wang从2017年到2019年的自由泳学习笔记

    打腿 把注意力调整到脚部,尽量不要让他打出水面,因为在空气中大腿完全是无用功,但是如果只是脚跟出水一点,倒也没什么关心,但是主观上,要控制一下,如果你听到你的打腿是"咚咚咚咚"这样 ...

  8. Spring+Dubbo+TestNG接口测试初探

    最近因工作原因,需要测试dubbo接口,通过公司同事写的框架,再结合度娘的帮助,自己做了一些总结记录. 通过下文意在说明如何搭建一个spring + dubbo + testng的测试环境,并完成一个 ...

  9. await在forEach不起作用解决【await is a reserved word】

    原文链接:https://blog.csdn.net/ssbb1995/article/details/82084800 1.await 只能在 async中使用,如: async function ...

  10. JAVA笔记整理(六),JAVA中的多态

    JAVA引用变量有两个类型:一个是编译时类型,一个运行时类型 编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译时类型和运行时类型不一样,就形成了多态. 因为子类其 ...