Skip to content

格式化打印和键盘输入

格式化打印

fmt 包使用类似于 C 语言的 printf 和 scanf 的函数来实现格式化 I/O。'verbs' 格式源自 C 语言,但更简单。

详见官网fmt包的API:https://pkg.go.dev/fmt

image-07

导入 fmt 包。

go
import "fmt"

常用函数

go
// Print
func Print(a ...any) (n int, err error)

// Printf
func Printf(format string, a ...any) (n int, err error)

// Println
func Println(a ...any) (n int, err error)

通用占位符

占位符说明
%v使用默认格式打印值。当打印结构体时,使用加号标志(%+v)可以在打印结果中包含字段名。
%#v以 Go 语法的表示形式打印值。
%T以 Go 语法的表示形式打印值的类型。
%%表示一个字面上的百分号,不会消耗任何值。

通用占位符示例

go
package main

import "fmt"

func main() {
	// %v:使用默认格式打印值。
	num := 10
	str := "Hello, Go"
	fmt.Printf("%v\n", num) // 输出: 10
	fmt.Printf("%v\n", str) // 输出: Hello, Go
}
go
package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	// %+v: 当打印结构体时,使用加号标志可以在打印结果中包含字段名。
	p := Person{
		Name: "John",
		Age:  30,
	}
	fmt.Printf("%+v\n", p) // 输出: {Name:John Age:30}
}
go
package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	// %#v:以 Go 语法的表示形式打印值。
	p1 := Person{
		Name: "Tom",
		Age:  20,
	}
	fmt.Printf("%#v\n", p1) // 输出结果: main.Person{Name:"Tom", Age:20}
}
go
package main

import "fmt"

func main() {
	// %T:以 Go 语法的表示形式打印值的类型。
	n1 := 100
	s1 := "Hello Golang"
	fmt.Printf("%T\n", n1) // 输出结果: int
	fmt.Printf("%T\n", s1) // 输出结果: string
}
go
package main

import "fmt"

func main() {
	// %%:表示一个字面上的百分号,不会消耗任何值。
	fmt.Printf("The percentage is: %%\n") // 输出: The percentage is: %
}

布尔类型占位符

占位符说明
%t是一个用于布尔值的格式化打印占位符。它会将布尔值格式化为字符串形式,即打印出单词 "true" 或 "false"。

布尔类型占位符示例

go
package main

import "fmt"

func main() {
	// %t:占位符用于格式化布尔值。它会将布尔值格式化为字符串形式,即打印出单词"true"或"false"。
	flag1 := true
	flag2 := false
	fmt.Printf("%t\n", flag1) // 输出结果: true
	fmt.Printf("%t\n", flag2) // 输出结果: false
}

整数类型占位符

占位符说明
%b以二进制(base 2)形式打印整数值。
%c打印对应的 Unicode 代码点所表示的字符。
%d以十进制(base 10)形式打印整数值。
%o以八进制(base 8)形式打印整数值。
%O以带有 0o 前缀的八进制(base 8)形式打印整数值。
%q以带有单引号的字符字面值形式打印字符,使用 Go 语法进行安全转义。
%x以十六进制(base 16)形式打印整数值,其中字母 a-f 为小写。
%X以十六进制(base 16)形式打印整数值,其中字母 A-F 为大写。
%U以 Unicode 格式打印整数值,格式为 U+1234,与 "U+%04X" 相同。

整数类型占位符示例

go
package main

import "fmt"

func main() {
	// %b:以二进制(base 2)形式打印整数值。
	num := 2
	fmt.Printf("%b\n", num)
}
go
package main

import "fmt"

func main() {
	// %c:打印对应的 Unicode 代码点所表示的字符。
	ch1 := 'A'
	fmt.Printf("%c\n", ch1) // 输出结果:A
}
go
package main

import "fmt"

func main() {
	// %d:以十进制(base 10)形式打印整数值。
	num := 123
	fmt.Printf("%d\n", num) // 输出结果:123
}
go
package main

import "fmt"

func main() {
	// %o:以八进制(base 8)形式打印整数值。
	num := 18
	fmt.Printf("%o\n", num) // 输出结果:22
}
go
package main

import "fmt"

func main() {
	// %O:以带有 0o 前缀的八进制(base 8)形式打印整数值。
	num := 22
	fmt.Printf("%O\n", num) // 输出结果:0o26
}
go
package main

import "fmt"

func main() {
	// %q:以带有单引号的字符字面值形式打印字符,使用 Go 语法进行安全转义。
	ch := 'C'
	fmt.Printf("%q\n", ch) // 输出结果:'C'
}
go
package main

import "fmt"

func main() {
	// %x:以十六进制(base 16)形式打印整数值,其中字母 a-f 为小写。
	num := 42
	fmt.Printf("%x\n", num) // 输出结果:2a
}
go
package main

import "fmt"

func main() {
	// %X:以十六进制(base 16)形式打印整数值,其中字母 A-F 为大写。
	num := 42
	fmt.Printf("%X\n", num) // 输出结果:2A
}
go
package main

import "fmt"

func main() {
	// %U:以 Unicode 格式打印整数值,格式为 U+1234,与 "U+%04X" 相同。
	ch := 'D'
	fmt.Printf("%U\n", ch) // 输出结果:U+0044
}

浮点(复数)类型占位符

占位符说明
%b按照 strconv.FormatFloat 中 'b' 格式的方式,以指数为 2 的幂的科学计数法打印浮点数,例如 -123456p-78。
%e科学计数法表示,例如 -1.234456e+78。
%E科学计数法表示,使用大写字母 E,例如 -1.234456E+78。
%f十进制小数表示,例如 123.456。
%F%f 的同义词。
%g对于较大的指数使用 %e,否则使用 %f。精度在下面进行讨论。
%G对于较大的指数使用 %E,否则使用 %F
%x以十六进制表示,带有十进制的指数部分,例如 -0x1.23abcp+20。
%X大写字母的十六进制表示,例如 -0X1.23ABCP+20。

浮点类型和复数类型的占位符示例

go
package main

import "fmt"

func main() {
	// %b:按照 strconv.FormatFloat 中 'b' 格式的方式,以指数为 2 的幂的科学计数法打印浮点数,例如 -123456p-78。
	f := -123456.789
	fmt.Printf("%b\n", f) // 输出: -8483885939586761p-36
}
go
package main

import "fmt"

func main() {
	// %e: 科学计数法表示,例如 -1.234456e+78。
	f := -1.234456789
	fmt.Printf("%e\n", f) // 输出: -1.234457e+00
}
go
package main

import "fmt"

func main() {
	// %E: 科学计数法表示,使用大写字母 E,例如 -1.234456E+78。
	f := -1.234456789
	fmt.Printf("%E\n", f) // 输出: -1.234457E+00
}
go
package main

import "fmt"

func main() {
	// %f: 十进制小数表示,例如 123.456。
	f := 123.456
	fmt.Printf("%f\n", f) // 输出: 123.456000
}
go
package main

import "fmt"

func main() {
	// %F: %f 的同义词。
	f := 123.456
	fmt.Printf("%F\n", f) // 输出: 123.456000
}
go
package main

import "fmt"

func main() {
	// %g: 对于较大的指数使用 %e,否则使用 %f。精度在下面进行讨论。
	f := 123.456789
	fmt.Printf("%g\n", f) // 输出: 123.456789
}
go
package main

import "fmt"

func main() {
	// %G: 对于较大的指数使用 %E,否则使用 %F。
	f := 123.456789
	fmt.Printf("%G\n", f) // 输出: 123.456789
}
go
package main

import "fmt"

func main() {
	// %x: 以十六进制表示,带有十进制的指数部分,例如 -0x1.23abcp+20。
	f := -123.456789
	fmt.Printf("%x\n", f) // 输出: -0x1.edd3c07ee0b0bp+06
}
go
package main

import "fmt"

func main() {
	// %X: 大写字母的十六进制表示,例如 -0X1.23ABCP+20。
	f := -123.456789
	fmt.Printf("%X\n", f) // 输出: -0X1.EDD3C07EE0B0BP+06
}

字符串(字节切片)占位符

占位符说明
%s以字节切片或字符串的形式打印未解释的字节。
%q以带有双引号的字符串形式打印字符串,并使用 Go 语法进行安全转义。
%x以十六进制(base 16)形式打印字节切片或字符串,其中每个字节用两个小写字母表示。
%X以十六进制(base 16)形式打印字节切片或字符串,其中每个字节用两个大写字母表示。

字符串和字节切片的占位符示例

go
package main

import "fmt"

func main() {
	// %s: 以字节切片或字符串的形式打印未解释的字节。
	name := "MagicGopher"
	fmt.Printf("%s\n", name) // 输出结果: MagicGopher
}
go
package main

import "fmt"

func main() {
	// %q: 以带有双引号的字符串形式打印字符串,并使用 Go 语法进行安全转义。
	name := "MagicGopher"
	fmt.Printf("%q\n", name) // 输出结果: "MagicGopher"
}
go
package main

import "fmt"

func main() {
	// %x: 以十六进制(base 16)形式打印字节切片或字符串,其中每个字节用两个小写字母表示。
	data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}
	fmt.Printf("%x\n", data) // 输出结果: 48656c6c6f
}
go
package main

import "fmt"

func main() {
	// %X: 以十六进制(base 16)形式打印字节切片或字符串,其中每个字节用两个大写字母表示。
	data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}
	fmt.Printf("%X\n", data) // 输出结果: 48656C6C6F
}

切片类型占位符

占位符说明
%p以 16 为基数表示法的第 0 个元素的地址,前导 0x

切片类型示例

go
package main

import "fmt"

func main() {
	// %p: 以 16 为基数表示法的第 0 个元素的地址,前导 0x
	numbers := []int{1, 2, 3, 4, 5}

	fmt.Printf("Slice address: %p\n", numbers) // Slice address: 0x140000162d0【这里是切片的内存地址,是会发生变化的】
}

指针类型占位符

占位符说明
%p以 16 为基数表示法的第 0 个元素的地址,前导 0x
%b、%d、%o、%x 和 %X 动词也可以与指针一起使用,将该值完全格式化为整数。

指针类型示例

go
package main

import "fmt"

func main() {
	// %p: 以 16 为基数表示法的第 0 个元素的地址,前导 0x
	value := 42
	pointer := &value

	fmt.Printf("Value: %p\n", pointer) // Value: 0x14000110018【这里是value变量的内存地址,是会发生变化的】
}

键盘输入

fmt包读取键盘输入

常用函数

go
// Scan
func Scan(a ...any) (n int, err error)

// Scanf
func Scanf(format string, a ...any) (n int, err error)

// Scanln
func Scanln(a ...any) (n int, err error)
go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 定义两个变量
	var name string
	var age int

    // _(下划线)通常用作匿名变量,它的作用是忽略对应的值。
	fmt.Print("请输入姓名: ")
	_, err := fmt.Scan(&name)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(1)
	}

	fmt.Print("请输入年龄: ")
	_, err = fmt.Scan(&age)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(1)
	}
	// 打印输出
	fmt.Println("Name:", name)
	fmt.Println("Age:", age)
}
go
package main

import "fmt"

func main() {
	// 定义两个变量
	var name string
	var age int

	// 输入姓名和年龄
	// _(下划线)通常用作匿名变量,它的作用是忽略对应的值。
	fmt.Printf("输入姓名和年龄: ")
	_, err := fmt.Scanf("%s %d", &name, &age)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
    // 打印输出
	fmt.Println("Name:", name)
	fmt.Println("Age:", age)
}
go
package main

import "fmt"

func main() {
	// 定义两个变量
	var name string
	var age int

	// 输入姓名和年龄
	// _(下划线)通常用作匿名变量,它的作用是忽略对应的值。
	fmt.Print("输入姓名和年龄: ")
	_, err := fmt.Scanln(&name, &age)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	// 打印输出
	fmt.Println("Name:", name)
	fmt.Println("Age:", age)
}

bufio包读取

bufio 包实现缓冲 I/O。 它包装一个 io.Readerio.Writer 对象,创建另一个对象(Reader 或 Writer),该对象也实现该接口,但为文本 I/O 提供缓冲和一些帮助。

详见官网bufio包的API:https://pkg.go.dev/bufio

image-08

先创建Reader实例。

image-09

然后就能使用读取相关方法了。

image-10

示例

go
package main

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

func main() {
	// 使用bufio包获取键盘输入内容
	reader := bufio.NewReader(os.Stdin)

	// 读取输入
	fmt.Print("请输入姓名: ")
	name, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	// 打印输出
	fmt.Println("Name:", name)
}

根据 MIT 许可证发布