Golang中的格式化输入输出

打印输出

在Go语言中有多种输出方式,不同的输出适用场景不同。归纳起来有三种,每种还分为3种方式(原内容、原内容+ln、原内容+f)

PrintXX()FprintXX()SprintXX()

 

FprintXX

// Fprintln formats using the default formats for its operands and writes to w.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
	p := newPrinter()
	p.doPrintln(a)
	n, err = w.Write(p.buf)
	p.free()
	return
}
// doPrintln is like doPrint but always adds a space between arguments
// and a newline after the last argument.
func (p *pp) doPrintln(a []interface{}) {
	for argNum, arg := range a {
		if argNum > 0 {
			p.buf.writeByte(' ')
		}
		p.printArg(arg, 'v')
	}
	p.buf.writeByte('\n')
}
func main() {
	fmt.Fprint(os.Stdout, "内容1")        // 向流中写入内容,多个内容之间没有空格
	fmt.Fprintln(os.Stdout, "内容2")      // 向流中写入内容额外写如换行符,多个内容之间有空格分割
	fmt.Fprintf(os.Stdout, verb, "内容3") // 根据verb格式向流中写入内容
}

 

PrintXX

// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}
func main() {
	fmt.Print("内容", "内容")       // 输出内容后不换行
	fmt.Fprintln("内容", "内容")   // 输出内容后换行
	fmt.Fprintf(verb, "内容") // 根据verb输出指定格式内容
}

 

SprintXX

// Sprintln formats using the default formats for its operands and returns the resulting string.
// Spaces are always added between operands and a newline is appended.
func Sprintln(a ...interface{}) string {
	p := newPrinter()
	p.doPrintln(a)
	s := string(p.buf)
	p.free()
	return s
}
func main() {
	fmt.Sprint("内容1", "内容2")
	fmt.Sprintln("内容2")
	fmt.Sprintf(verb, "内容3")
}

 

常用转义字符汇总

verb含义
%d十进制整数
%x,%X大小写方式显示十六进制整数
%o八进制整数
%b二进制整数
%f,%g,%e浮点数
%t布尔值
%c字符
%s字符串
%q输出带双引号的字符串
%v对应值的默认格式
%T类型
%p内存地址
%%字符%
\n换行
\t缩进

 

接收用户输入

程序运行时,运行到接收用户输入语句,程序阻塞,用户在控制台输入内容后,把内容赋值给对应的变量,程序继续运行。

接收用户输入的几种方式

使用Scanln(&变量名, &变量名)的方式接收

  • 输入的内容必须都在同一行
  • 每个内容之间使用空格分割
  • 回车换行后表示停止输入
    • 如果希望接收3个值,而在控制台只输入2个值,回车后也停止接收
    • 如果希望接收2个值,而在控制台输入3个值,回车后只能接收两个值
func main() {
	var name, age string
	fmt.Print("请输入姓名和年龄: ")
	fmt.Scanln(&name, &age) // 此处&变量名是地址
	fmt.Println("接收到的内容为: ", name, age)
}

 

使用Scanf(verb, &变量名)按照指定的格式进行输入

func main() {
	var a, b string
	fmt.Scanf("%s\n%s", &a, &b)
	fmt.Printf("%s\n%s", a, b)
}

上面程序中,每次换行输入一个内容。

如果需要同行输入两个字符串,中间使用空格分割。

func main() {
	var a string
	var b string
	//输入时必须输入: aaa bbb
	//如果中间没有空格则把所有内容都赋值给了a
	fmt.Println(a, b)
}