【原创】go语言学习(十四)IO操作1

目录:

  • 格式化输入
  • 格式化输出
  • 终端输入输出背后的原理理
  • 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)
}

  

原文地址:https://www.cnblogs.com/wangshuyang/p/11813085.html

时间: 2024-08-01 07:28:25

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

C++语言学习(四)——类与对象

C++语言学习(四)--类与对象 一.构造函数(constructor) 1.构造函数简介 C++语言中,构造函数是与类名相同的特殊成员函数.在类对象创建时,自动调用构造函数,完成类对象的初始化.类对象本身是变量,在栈.堆上创建的对象,对象的成员初始化为随机值:在静态存储区创建的对象,对象的成员初始化为0. 2.构造函数的定义 构造函数声明的语法如下:classname(parameters);没有参数的构造函数称为无参构造函数.当类中没有定义构造函数(包括拷贝构造函数)时,编译器默认提供一个无

Oracle学习(十四):管理用户安全

--用户(user) SQL> --创建名叫 grace 密码是password 的用户,新用户没有任何权限 SQL> create user grace identified by password; 验证用户: 密码验证方式(用户名/密码) 外部验证方式(主机认证,即通过登陆的用户名) 全局验证方式(其他方式:生物认证方式.token方式) 优先级顺序:外部验证>密码验证 --权限(privilege) 用户权限有两种: System:允许用户执行对于数据库的特定行为,例如:创建表.

Go语言学习笔记(四) [array、slices、map]

日期:2014年7月22日 一.array[数组] 1.定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内容的类型. 例如: var arr[10] int arr[0] = 1 arr[1] = 2 数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素.另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针. 2.数组的复合声明.a :=[3]int{1,2,3}或简写为a:=[...]i

C语言第十四回合:结构体大集合

C语言第十四回合:结构体大集合 [学习目标] 1.        结构体 2.        结构体数组 3.        结构体指针 结构体:是数据结构类型,把有内在联系的不同类型的数据统一成一个整体,使它们相互关联.是变量的集合,可以单独使用其的成员. A:结构体的定义 使用关键字:struct struct 结构体名 { 类型标识符  成员名1; 类型标识符  成员名2; -- };     //分号一定不能省 PS: (1)结构定义并不预留内存,结构体变量的定义才引起存储分配 (2) 

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

文件IO操作相关系统编程 这里主要说两套IO操作接口,分别是: POSIX标准 read|write接口,函数定义在#include<unistd.h> ISO C标准 fread|fwrite接口,函数定义在#include<stdio.h> 有书上说POSIX标准与ISO C标准的区别在于文件读写是否带缓冲区,我则不是很认同,因此POSIX标准下的IO操作也是带缓冲区的,至于这两个标准下的IO性能谁更加好则不一定,因为这和缓冲区的大小,以及用户逻辑有很大关系. POSIX标准

Perl语言学习笔记 13 目标操作

1.改变目录 chdir "/etc" or die "can't chdir to '/etc'!\n"; 省略参数会回到用户主目录,与cd效果一样: 2.文件名通配 my @all_files = glob "*"; #不包括以点号开头的文件 my @pm_files = glob "*.pm"; 一次匹配多种模式,用空格隔开:my @files = ".* *"; #可以匹配所有的文件,包括以点号开头

蓝鸥C语言学习第四天

今天主要学习数组,什么叫是数组呢? 数组:就是存放相同类型的若干变量的集合.数组属于构造类型. 一维数组的定义方式:类型  数组名[元素个数] = {元素1, 元素2, .........}; int a[5]; 注意:[]只能放在数组名的后面,下面的都是错误写法: 1 int a[5] a;// 错误 2 int[] b; // 错误 **[]里面的个数必须是一个固定值,可以是常量(比如7.10).常量表达式(比如3+4.5*7).绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要

android学习十四(android的接收短信)

收发短信是每个手机基本的操作,android手机当然也可以接收短信了.android系统提供了一系列的API,使得我们可以在自己的应用程序里接收和发送短信. 其实接收短信主要是利用我们前面学过的广播机制.当手机接收到一条短信的时候,系统会发出一条值为andorid.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据.每个应用程序都可以在广播接收器里对它进行监听,收到广播时在从中解析出短信的内容即可. 下面我们来个具体的例子实践下吧,新建一个

JS学习十四天----服务器端执行JS代码

服务器端执行JS代码 话说,当今不在客户端使用JS代码才是稀罕事.由于web应用的体验越来越丰富,客户端用JS实现的逻辑也越来越多,这造成的结果就是某些几乎一致的逻辑需要在客户端和服务端各实现一遍,大牛们当然不甘心啊!幸运的是,我们可以在服务器端执行JS代码,谁让JS抱了一根大腿呢... 例如,如今在客户端使用JS进行验证已经是个标准,他可以有效避免用户在正常情况下提交错误的数据,增强用户体验.当然,服务器端的验证也是必不可少的,因为这才是安全性的体现.有些解决方案,,会在服务器端提供优先的验证

C语言--&gt;(十四)结构体、宏、编译

知识点: 1.结构体 struct 2.typedef关键字 3.宏的定义 4.宏与函数的区别 5.文件包含和多文件编译 6.条件编译 ===========================结构体 思考:如果现在希望保存一个学生的信息,姓名,身高,年龄,地址,该如何保存 char name[64]; float height; int age; char addr[64]; 1.什么是结构体 struct 结构体指的是一种数据结构,是c语言中复合数据类型的一 种多种不同数据类型的集合 2.结构体