1、文件描述符
go
var (
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)
-
Go中的
os
包有三个对外暴露的三个文件描述符os.Stdin
- 标准输入,文件描述符为:0。os.Stdout
- 标准输出,文件描述符为:1。os.Stderr
- 标准错误,文件描述符为:2。
2、输出
-
stdout:使用底层os.Stdout.WriteString函数。
gopackage main import "os" func main() { os.Stdout.WriteString("Hello World") }
-
print和println:使用Go内置的print和println,输出到标准错误中。
gopackage main func main() { print("hello world!\n")//不带换行 println("hello world")//自带换行 }
-
fmt:fmt包下的输出,输出到标准输出中。
gopackage main import "fmt" func main() { fmt.Println("hello world") }
-
bufio:带缓冲的输出。
bufio
提供了可缓冲的输出方法,它会先将数据写入到内存中,积累到了一定阈值再输出到指定的Writer
中,默认缓冲区大小是4KB
。在文件 IO,网络 IO 的时候建议使用这个包。gofunc main() { writer := bufio.NewWriter(os.Stdout) defer writer.Flush() writer.WriteString("hello world!") }
-
输出格式化
Go中的格式化输出功能基本上由
fmt.Printf
函数提供。gofunc main() { fmt.Printf("hello world, %s!", "jack") }
序号 | 格式化 | 描述 | 接收类型 |
---|---|---|---|
1 | %% |
输出百分号% |
任意 |
2 | %s |
输出string /[] byte 值 |
string ,[] byte |
3 | %q |
格式化字符串,输出的字符串两端有双引号"" |
string ,[] byte |
4 | %d |
输出十进制整型值 | 整型 |
5 | %f |
输出浮点数 | 浮点 |
6 | %e |
输出科学计数法形式 ,也可以用于复数 | 浮点 |
7 | %E |
与%e 相同 |
浮点 |
8 | %g |
根据实际情况判断输出%f 或者%e ,会去掉多余的 0 |
浮点 |
9 | %b |
输出整型的二进制表现形式 | 数字 |
10 | %#b |
输出二进制完整的表现形式 | 数字 |
11 | %o |
输出整型的八进制表示 | 整型 |
12 | %#o |
输出整型的完整八进制表示 | 整型 |
13 | %x |
输出整型的小写十六进制表示 | 数字 |
14 | %#x |
输出整型的完整小写十六进制表示 | 数字 |
15 | %X |
输出整型的大写十六进制表示 | 数字 |
16 | %#X |
输出整型的完整大写十六进制表示 | 数字 |
17 | %v |
输出值原本的形式,多用于数据结构的输出 | 任意 |
18 | %+v |
输出结构体时将加上字段名 | 任意 |
19 | %#v |
输出完整 Go 语法格式的值 | 任意 |
20 | %t |
输出布尔值 | 布尔 |
21 | %T |
输出值对应的 Go 语言类型值 | 任意 |
22 | %c |
输出 Unicode 码对应的字符 | int32 |
23 | %U |
输出字符对应的 Unicode 码 | rune ,byte |
24 | %p |
输出指针所指向的地址 | 指针 |
3、 输入
- read:使用底层os.Stdin.Read函数。
go
func main() {
var buf [1024]byte
n, _ := os.Stdin.Read(buf[:])
os.Stdout.Write(buf[:n])
}
- fmt:fmt包下的输入。
go
// 扫描从os.Stdin读入的文本,根据空格分隔,换行也被当作空格
func Scan(a ...any) (n int, err error)
// 与Scan类似,但是遇到换行停止扫描
func Scanln(a ...any) (n int, err error)
// 根据格式化的字符串扫描
func Scanf(format string, a ...any) (n int, err error)
- bufio:在有大量输入需要读取的时候,就建议使用
bufio.Reader
来进行内容读取。
go
func main() {
reader := bufio.NewReader(os.Stdin)
var a, b int
fmt.Fscanln(reader, &a, &b)
fmt.Printf("%d + %d = %d\n", a, b, a+b)
}
- scanner:
bufio.Scanner
与bufio.Reader
类似,不过它是按行读取的。
go
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
if line == "exit" {
break
}
fmt.Println("scan", line)
}
}