Go语言格式化输出(fmt)

本文介绍Go语言中的格式化输出和输入方法,涵盖不同数据类型的格式化规则,如字符串、整数、浮点数等,并提供了多个示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go语言格式化输出

Go语言格式化输出

在Go语言中格式化输出通常使用 fmt 包,通用的输出格式如下表所示:

表:通用输出格式
输出格式 输出内容
%v 值的默认格式表示
%+v 类似 %v,但输出结构体时会添加字段名
%#v 值的 Go 语法表示
值的类型的 Go 语法表示
package main
import "fmt"
func main() {
    str := "steven"
    fmt.Printf("%T, %v \n", str, str)
    var a rune = '一'
    fmt.Printf("%T, %v \n", a, a)
    var b byte = 'b'
    fmt.Printf("%T, %v \n", b, b)
    var c int32 = 98
    fmt.Printf("%T, %v \n", c, c)
}

// 结果
string, steven
int32, 19968
uint8, 98
int32, 98

格式化输出布尔类型

表:布尔类型输出格式
输出格式 输出内容
%t 单词 true 或 false
package main
import "fmt"
func main() {
    var flag bool
    fmt.Printf("%T, %t \n", flag, flag)
    flag = true
    fmt.Printf("%T, %t \n", flag, flag)
}

// 结果
bool, false
bool, true

格式化输出整数类型

表:整型的输出格式
输出格式 输出内容
%b 表示为二进制
%c 该值对应的 unicode 码值
%d 表示为十进制
%8d 表示该整型长度是 8,不足 8 则在数值前补空格;如果超出 8,则以实际为准
%08d 表示该整型长度是 8,不足 8 则在数值前补 0;如果超出 8,则以实际为准
%o 表示为八进制
%q 该值对应的单引号括起来的Go语言语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用 a~f
%X 表示为十六进制,使用 A~F
%U 表示为 unicode 格式:U+1234,等价于 U+%04X
package main
import "fmt"
func main() {
    fmt.Printf("%T, %d \n", 123, 123)
    fmt.Printf("%T, %5d \n", 123, 123)
    fmt.Printf("%T, %05d \n", 123, 123)
    fmt.Printf("%T, %b \n", 123, 123)
    fmt.Printf("%T, %o \n", 123, 123)
    fmt.Printf("%T, %c \n", 97, 97)
    fmt.Printf("%T, %q \n", 97, 97)
    fmt.Printf("%T, %x \n", 123, 123)
    fmt.Printf("%T, %X \n", 123, 123)
    fmt.Printf("%T, %U \n", '一', '一')
}

// 结果
int, 123
int,   123
int, 00123
int, 1111011
int, 173
int, a
int, 'a'
int, 7b
int, 7B
int32, U+4E00

格式化输出浮点型与复数型

表:浮点型输出格式
输出格式 输出内容
%b 无小数部分、二进制指数的科学计数法,如 -123456p-78
%e (=%.6e)有 6 位小数部分的科学计数法,如 -1234.456e+78
%E 科学计数法,如 -1234.456E+78
%f  (=%.6f)有 6 位小数部分,如 123.456123
%F 等价于 %f
%g 根据实际情况采用 %e 或 %f 格式(获得更简洁、准确的输出)
%G 根据实际情况采用 %E 或 %F 格式(获得更简洁、准确的输出)
package main
import "fmt"
func main() {
    fmt.Printf("%b \n", 123.123456)
    fmt.Printf("%f \n", 123.1)
    fmt.Printf("%.2f \n", 123.125456)
    fmt.Printf("%e \n", 123.123456)
    fmt.Printf("%E \n", 123.123456)
    fmt.Printf("%.1e \n", 123.123456)
    fmt.Printf("%F \n", 123.123456)
    fmt.Printf("%g \n", 123.123456)
    fmt.Printf("%G \n", 123.123456)
}

// 结果
8664042977533870p-46
123.100000
123.13
1.231235e+02
1.231235E+02
1.2e+02
123.123456
123.123456
123.123456

格式化输出字符串与字节数组

表:字符串输出格式
输出格式 输出内容
%s 直接输出字符串或者字节数组
%q 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示,使用 a~f
%X 每个字节用两字符十六进制数表示,使用 A~F
package main
import "fmt"
func main() {
    arr := []byte{'x', 'y', 'z', 'z'}
    fmt.Printf("%s \n", "欢迎访问")
    fmt.Printf("%q \n", "欢迎访问")
    fmt.Printf("%x \n", "欢迎访问")
    fmt.Printf("%X \n", "欢迎访问")
    fmt.Printf("%T, %s \n", arr, arr)
    fmt.Printf("%T, %q \n", arr, arr)
    fmt.Printf("%T, %x \n", arr, arr)
    fmt.Printf("%T, %X \n", arr, arr)
}

//
欢迎访问
"欢迎访问"
e6aca2e8bf8ee8aebfe997aee5beaee5ada6e88b91
E6ACA2E8BF8EE8AEBFE997AEE5BEAEE5ADA6E88B91
[]uint8, xyzz
[]uint8, "xyzz"
[]uint8, 78797a7a
[]uint8, 78797A7A 

格式化输出其他数据

常用格式化字符串格式符

  1. 基本类型格式符

    • %v:值的默认格式。
    • %+v:结构体的字段名和值。
    • %#v:值的 Go 语法表示。
    • %T:值的类型。
  2. 布尔类型

    • %t:布尔值,输出 truefalse
  3. 整数类型

    • %d:十进制整数。
    • %b:二进制整数。
    • %o:八进制整数。
    • %x:十六进制整数(小写字母)。
    • %X:十六进制整数(大写字母)。
    • %c:对应 Unicode 码点的字符。
  4. 浮点数和复数

    • %f:十进制浮点数。
    • %e:科学计数法(小写字母)。
    • %E:科学计数法(大写字母)。
    • %g:根据值的大小自动选择 %e%f 格式。
    • %G:根据值的大小自动选择 %E%f 格式。
  5. 字符串和字节切片

    • %s:字符串。
    • %q:双引号括起来的字符串(带转义)。
    • %x:字节切片的十六进制表示。
  6. 指针

    • %p:指针的十六进制表示。

格式化选项

在格式符前可以添加一些选项来控制输出格式:

  • 宽度:指定输出的最小宽度,例如 %5d 表示输出至少 5 个字符宽的整数。
  • 精度:对于浮点数,指定小数点后的位数,例如 %.2f 表示输出两位小数。
  • 填充字符:可以在宽度前加上 0 来用零填充,例如 %05d 表示输出至少 5 个字符宽的整数,不足部分用零填充。
  • 对齐:默认是右对齐,可以使用 - 来左对齐,例如 %-5s 表示左对齐的字符串。

fmt

fmt包实现了类似C语言printf和scanf的格式化I/O。
主要分为向外输出内容和获取输入内容两大部分。

向外输出

Print

Print系列函数会将内容输出到系统的标准输出,区别在于:

  1. Print函数直接输出内容,
  2. Printf函数支持格式化输出字符串,
  3. Println函数会在输出内容的结尾添加一个换行符。
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

Fprint

Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中,我们通常用这个函数往文件中写入内容。

func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

只要满足io.Writer接口的类型都支持写入,包括web io。

Sprint

Sprint系列函数会把传入的数据生成并返回一个字符串。

func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string

Errorf

Errorf函数根据format参数生成格式化字符串并返回一个包含该字符串的错误。

func Errorf(format string, a ...interface{}) error
e := errors.New("原始错误e")
w := fmt.Errorf("Wrap了一个错误%w", e)

获取输入

Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。

fmt.Scan

func Scan(a ...interface{}) (n int, err error)
  1. Scan从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。
  2. 本函数返回成功扫描的数据个数和遇到的任何错误。
  3. 如果读取的数据个数比提供的参数少,会返回一个错误报告原因。
func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scan(&name, &age, &married)
	fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}

fmt.Scanf

func Scanf(format string, a ...interface{}) (n int, err error)

Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。
返回成功扫描的数据个数和遇到的任何错误。

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
	fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}


// 输入:1:General_zy 2:21 3:false

fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。

fmt.Scanln(常用)

func Scanln(a ...interface{}) (n int, err error)

Scanln类似Scan,它在遇到换行时才停止扫描。最后一个数据后面必须有换行或者到达结束位置。
本函数返回成功扫描的数据个数和遇到的任何错误。

func main() {
	var (
		name    string
		age     int
		married bool
	)
	fmt.Scanln(&name, &age, &married)
	fmt.Printf("扫描结果 name:%s age:%d married:%t \n", name, age, married)
}

bufio.NewReader

有时候想完整获取输入的内容,而输入的内容可能包含空格,这种情况下可以使用bufio包来实现。示例代码如下:

func bufioDemo() {
	reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
	fmt.Print("请输入内容:")
	text, _ := reader.ReadString('\n') // 读到换行
	text = strings.TrimSpace(text)
	fmt.Printf("%#v\n", text)
}
### Go语言中的格式化输出方法 Go语言提供了强大的`fmt`包来支持格式化的输入和输出操作。其中,`fmt.Printf`函数是最常见的用于格式化输出的方式之一[^1]。 #### 基础语法 `fmt.Printf(format string, a ...interface{}) (n int, err error)` 该函数接受两个参数:第一个是格式化字符串,第二个是一个或多个要被格式化的值。它会按照指定的格式将数据打印到标准输出流中,并返回写入的字节数以及可能发生的错误。 #### 格式化标志 以下是几种常用的格式化标志及其作用: - **宽度控制**:可以通过在 `%` 和字母之间插入数字来设置最小字段宽度。如果内容长度小于这个宽度,则会在左侧填充空白字符。 ```go fmt.Printf("|%6d|%6.2f|\n", 123, 123.45) // 输出 | 123| 123.45| ``` - **对齐方式**:默认情况下,整数右对齐而浮点数左对齐;可以在宽度前加 `-` 符号实现强制左对齐。 ```go fmt.Printf("|%-6d|%-6.2f|\n", 123, 123.45) // 输出 |123 |123.45 | ``` - **数值与字符串格式化** - 整型可以用 `%d` 表示十进制形式,或者用 `%b`, `%o`, `%x` 来分别表示二进制、八进制和十六进制形式。 ```go fmt.Printf("%d %b %o %x\n", 255, 255, 255, 255) // 输出 255 11111111 377 ff ``` - 浮点数通常采用 `%f` 或者科学计数法 `%e/%E` 进行显示。 ```go fmt.Printf("%.2f %.2e\n", 123.456, 123.456) // 输出 123.46 1.23e+02 ``` - **特殊类型输出** - 对于指针类型的变量,可以使用 `%p` 打印其地址。 ```go var ptr *int = new(int) fmt.Printf("Pointer address: %p\n", ptr) ``` - 如果希望字符串自动加上双引号包裹,可选用 `%q` 占位符。 ```go str := "hello world" fmt.Printf("String with quotes: %q\n", str) // String with quotes: "hello world" ``` #### 文件输出实例 除了向终端输出外,还可以利用 `fmt.Fprintf` 将格式化后的文本写入文件或其他 io.Writer 接口对象中[^3]。下面展示了一个简单的例子,演示如何把一段文字追加至现有文件末尾: ```go package main import ( "fmt" "os" ) func main() { fileObj, err := os.OpenFile("./example.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { fmt.Println("Failed to open file:", err) return } defer fileObj.Close() info := "This is an additional line." fmt.Fprintf(fileObj, "%s\n", info) } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Generalzy

文章对您有帮助,倍感荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值