本文主要参考CSDN以及golang官方文档书写,主要是fmt包提供的标准输入输出的笔记;
fmt.Scan/Sscan/Fscan 以及对应的*f,*ln和print类族
一. 标准输入 [return (n int, err error)]
1. fmt.Scan/fmt.Scanf/fmt.Scanln
这三个方法接收n个指针类型的参数(包括string 指针)将os.Stdin 输入内容传入 参数变量中;
使用指针的目的是为确保基本类型的输入能够真正修改输入的变量;
var i int
fmt.Scan(&i)
fmt.Scanf("%d",&i)
fmt.Scanln(&i)
2. fmt.Sscan/fmt.Sscanf/fmt.Sscanln
这三个方法是从string 中读取值,用将string取代 标准输入;
s := "abc 1 2"
var s_ string
var i,j int
fmt.Sscan(s,&s_,&i,&j)
fmt.Sscanf(s,"%s $d $d",&s_,&i,&j)
fmt.Sscanln(s,&s_,&i,&j)
3. fmt.Fscan/fmt.Fscanf/fmt.Fscanln
这三个方法则是通过在提供的实现了io.Reader 接口的Read方法的输入源中输入整体类似```fmt.Sscan```
var i int
fmt.Fscan(os.Stdin,&i)
fmt.Fscanf(os.Stdin,"%d",&i)
fmt.Fscanln(os.Stdin,&i)
4. bufio.Reader.Readxxx
使用类似```fmt.Fscan```的方法,通过读取标准Stdin 输入进行输入,
使用bufio 的目的是它可以设置部分读取后部分处理然后再处理后面的内容,
中间出现类型或者格式错误依旧可以处理
in := bufio.NewReader(os.Stdin)
ret,err := in.ReadString('\n')//这里是分隔符作为参数,会将分隔符作为空格使用
/*
此外还有
bufio.Reader.Read(p []byte) (n int, err error)
bufio.Reader.ReadByte() (byte, error)
bufio.Reader.ReadBytes(delim byte) ([]byte, error)
....
*/
5.总结
对于fmt.*scan*系列,遇到错误(类型或者格式上的错误)会将不会重新读取输入除非换输入源;想要避免这个问题可以使用换源或者使用bufio 作为输入字符串然后进行解析的方式避免
二. 标准输出
由于输入输出比较类似,所以仅仅列举输出方法,与输入的区别主要体现在返回值的不同上
// @return n int, err error
fmt.Print
fmt.Println
fmt.Printf // 由于输出仅需要值传递所以使用原数值进行值传递
//@return s string
fmt.Sprint(a...interface{})
fmt.Sprintf(format string, a...interface{})
fmt.Sprintln(a...interface{})
//@return n int,err error | 这一簇是通过将向实现了io.Writer接口(即其Write方法)的对象源中输入值
fmt.Fprint(io.Writer,a...interface{})
fmt.Fprintf(io.Writer,format string, a...interface{})
fmt.Fprintln(io.Writer,a...interface{})
//此种方法下依旧可以使用bufuio或者io等方法
bufio.NewWriter(io.Writer)
bufio.NewWriterSize(io.Writer,size)
//out.Write([]byte) (n int,err error)
//out.WriteString(data string) (n int, err error)
//注意此处,完全输出最好需要Flush
三. io.Reader/io.Writer
io.Reader:
type Reader interface{
Read(p []byte)(n int, err error)
}
io.Writer:
type Writer interface{
Write(p []byte)(n int,err error)
}
补充:
- 格式化对照表
%% : 一个%字面量
%b : 一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数
%c : 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
%d : 一个十进制数值(基数为10)
%e : 以科学记数法e表示的浮点数或者复数值
%E : 以科学记数法E表示的浮点数或者复数值
%f : 以标准记数法表示的浮点数或者复数值
%g : 以%e或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出
%G : 以%E或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出
%o : 一个以八进制表示的数字(基数为8)
%p : 以十六进制(基数为16)表示的一个值的地址,前缀为0x,字母使用小写的a-f表示
%q : 使用Go语法以及必须时使用转义,以双引号括起来的字符串或者字节切片[]byte,或者是以单引号括起来的数字
%s : 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
%t : 以true或者false输出的布尔值
%T : 使用Go语法输出的值的类型
%U : 一个用Unicode表示法表示的整型码点,默认值为4个数字字符
%v : 使用默认格式输出的内置或者自定义类型的值,或者是使用其类型的String()方式输出的自定义值,如果该方法存在的话
%x : 以十六进制表示的整型值(基数为十六),数字a-f使用小写表示
%X : 以十六进制表示的整型值(基数为十六),数字A-F使用小写表示