输入和输出是编程语言使用比较基础,但容易被忽视的地方。因为实际开发的都是不会使用命令行,但这方面仍然是需要我们掌握的知识点。
Go语言中函数就是指类似C语言的函数,而方法指的是实现了接口的函数,两个在概念上是不一样的。
首先Go语言fmt
包中提供了Scanf
和Printf
像C语言那样处理输入和输出,使用的格式控制字符中常见的和C语言一致,一部分则不一致。
格式控制字符,又称转义字符,它对应一个变量名,以指定的格式将变量连接到输出的字符串中,它在字符串中相当于占位符,所处位置的内容将会被转化成对应格式的变量值替代。
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()
系列在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中文版) 机械工业出版社