Go语言输入输出

输入和输出是编程语言使用比较基础,但容易被忽视的地方。因为实际开发的都是不会使用命令行,但这方面仍然是需要我们掌握的知识点。

Go语言中函数就是指类似C语言的函数,而方法指的是实现了接口的函数,两个在概念上是不一样的。

首先Go语言fmt包中提供了ScanfPrintf像C语言那样处理输入和输出,使用的格式控制字符中常见的和C语言一致,一部分则不一致。

类C语言输入输出

Go转义字符

格式控制字符,又称转义字符,它对应一个变量名,以指定的格式将变量连接到输出的字符串中,它在字符串中相当于占位符,所处位置的内容将会被转化成对应格式的变量值替代。

Go语言中的转义字符(Go程序员称为verb),像%d%s%f和C语言保持一致,但同时也有一些不一样的格式控制字符,总结如下:

verb description
%d 十进制正数
%x, %o, %b 十六进制,八进制,二进制正数
%f, %g, %e 单精度,双精度,科学计数法表示浮点数
%t 布尔型:true或false
%c 字符
%s 字符串
%q 带引号字符串(“abc”)或字符(‘c’)
%v 内置格式的任何值
%T 任何值的类型
%% 百分号本身

注:(因为%被用作转义字符标志了,所以要想输出百分需要用百分号转义一下)。

实例(其他数据类型同理)。

package main

import "fmt"

func main() {
	var a int
	fmt.Scanf("%d", &a)
	fmt.Printf("%d", a)
}
// 输入
4
// 输出
4
不使用转义字符

转义字符是用来明确指定数据类型的,如果不需要明确指定,fmt包下提供了对应的Scan()Print(),用法也一致,不再举例。

多种形式的输出
  • print() (内置输出函数)
  • println() (内置输出函数,自带换行符)
  • printf() (内置格式化输出函数,需要使用换行符,并传入变量)
  • fmt.Print() (fmt包下的输出函数)
  • fmt.Println() (fmt包下的输出函数,自带换行符)
  • fmt.Printf() (fmt包下的格式化输出函数,需要使用换行符,并传入变量)
  • fmt.Fprintf() (Sprintf 则格式化并返回一个字符串而不带任何输出。)
  • fmt.Sprintf() (Fprintf 来格式化并输出到 io.Writers而不是 os.Stdout。)
区别

print()系列在golang中是属于输出到标准错误流中并打印,官方不建议写程序时候用它,可以在debug时候用。

fmt.Print()系列对应的是标准的输入输出流,建议使用。

流式处理输入

Go语言流式处理标准输入使用bufio包中的NewScanner方法,来读取os包下预置的Stdin,即标准输入流。流的概念的的话,是所有编程语言共享的,因此这里不再赘述。

bufio,顾名思义,包下的工具以带缓冲的方式处理输入输出流。

找出重复行 命令行读取

本例来自Go语言圣经,变量名略有改动。

// 模拟Unix uniq命令 找到相邻的重复行

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// 声明并初始化一个map
	count := make(map[string] int)
	// 声明一个用于处理标准输入流的Scanner
	input := bufio.NewScanner(os.Stdin)
	// 这里忽略了input.Err()抛出的错误
	for input.Scan() {
		count[input.Text()]++
	}
	for line, n := range count {
		if n > 1 {
			fmt.Printf("%d\t%s\n", n, line)
		}
	}
}
// 输入用例 ^D 是键盘 ctrl+d 告知系统输入结束
apple
bear
bear
peach
orange
orange
orange
banana^D

// 输出结果
2	bear
3	orange
找出重复行 文件读取

本例来自Go语言圣经,变量名略有改动。

Go语言读文件需要用到io/ioutil包下的ReadFile方法。以下这个例子还使用到了strings包下的Split方法,用于分割字符串。

// 模拟Unix uniq命令 找到相邻的重复行

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"strings"
)

func main() {
	// 声明并初始化一个map
	count := make(map[string] int)
	// 如果是多个文件 则遍历
	for _, filename := range os.Args[1:] {
		data, err := ioutil.ReadFile(filename)
		if err != nil {
			fmt.Fprintf(os.Stderr, "%v\n", err)
			continue
		}
		for _, line := range strings.Split(string(data), "\n") {
			count[line]++
		}
	}
	for line, n := range count {
		if n > 1 {
			fmt.Printf("%d\t%s\n", n, line)
		}
	}
}

输入样例

// file1
Steve
Mike
John

// file2
Michael
Steve
Riven

运行结果

D:\GoProject\main>go run iosimple.go file1.txt file2.txt
2       Steve

参考文献

Go程序设计语言(The Go Programming Language中文版) 机械工业出版社

C/C++——C语言格式化输入输出

你可能感兴趣的:(GoLang,input,output,io,stream,GoLang)