Go语言占位符的使用

# 定义示例类型和变量
type Human struct {
    Name string
}

var people = Human{Name:"zhangsan"}

普通占位符

占位符     说明                           举例                   输出
%v      相应值的默认格式。            Printf("%v", people)   {zhangsan},
%+v     打印结构体时,会添加字段名     Printf("%+v", people)  {Name:zhangsan}
%#v     相应值的Go语法表示            Printf("#v", people)   main.Human{Name:"zhangsan"}
%T      相应值的类型的Go语法表示       Printf("%T", people)   main.Human
%%      字面上的百分号,并非值的占位符  Printf("%%")            %

布尔占位符

占位符       说明                举例                     输出
%t          true 或 false。     Printf("%t", true)       true

整数占位符

占位符     说明                                  举例                       输出
%b      二进制表示                             Printf("%b", 5)             101
%c      相应Unicode码点所表示的字符              Printf("%c", 0x4E2D)        中
%d      十进制表示                             Printf("%d", 0x12)          18
%o      八进制表示                             Printf("%d", 10)            12
%q      单引号围绕的字符字面值,由Go语法安全地转义 Printf("%q", 0x4E2D)        '中'
%x      十六进制表示,字母形式为小写 a-f         Printf("%x", 13)             d
%X      十六进制表示,字母形式为大写 A-F         Printf("%x", 13)             D
%U      Unicode格式:U+1234,等同于 "U+%04X"   Printf("%U", 0x4E2D)         U+4E2D

浮点数和复数的组成部分(实部和虚部)


占位符     说明                              举例            输出
%b      无小数部分的,指数为二的幂的科学计数法,
        与 strconv.FormatFloat 的 'b' 转换格式一致。例如 -123456p-78
%e      科学计数法,例如 -1234.456e+78        Printf("%e", 10.2)     1.020000e+01
%E      科学计数法,例如 -1234.456E+78        Printf("%e", 10.2)     1.020000E+01
%f      有小数点而无指数,例如 123.456        Printf("%f", 10.2)     10.200000
%g      根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出 Printf("%g", 10.20)   10.2
%G      根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出 Printf("%G", 10.20+2i) (10.2+2i)

字符串与字节切片

占位符     说明                              举例                           输出
%s      输出字符串表示(string类型或[]byte)   Printf("%s", []byte("Go语言"))  Go语言
%q      双引号围绕的字符串,由Go语法安全地转义  Printf("%q", "Go语言")         "Go语言"
%x      十六进制,小写字母,每字节两个字符      Printf("%x", "golang")         676f6c616e67
%X      十六进制,大写字母,每字节两个字符      Printf("%X", "golang")         676F6C616E67

指针

占位符         说明                      举例                             输出
%p      十六进制表示,前缀 0x          Printf("%p", &people)             0x4f57f0

其它标记

占位符      说明                             举例          输出
+      总打印数值的正负号;对于%q(%+q)保证只输出ASCII编码的字符。 
                                           Printf("%+q", "中文")  "u4e2du6587"
-      在右侧而非左侧填充空格(左对齐该区域)
#      备用格式:为八进制添加前导 0(%#o)      Printf("%#U", '中')      U+4E2D
       为十六进制添加前导 0x(%#x)或 0X(%#X),为 %p(%#p)去掉前导 0x;
       如果可能的话,%q(%#q)会打印原始 (即反引号围绕的)字符串;
       如果是可打印字符,%U(%#U)会写出该字符的
       Unicode 编码形式(如字符 x 会被打印成 U+0078 'x')。
' '    (空格)为数值中省略的正负号留出空白(% d);
       以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开
0      填充前导的0而非空格;对于数字,这会将填充移到正负号之后

golang没有 '%u' 点位符,若整数为无符号类型,默认就会被打印成无符号的。

宽度与精度的控制格式以Unicode码点为单位。宽度为该数值占用区域的最小宽度;精度为小数点之后的位数。
操作数的类型为int时,宽度与精度都可用字符 '*' 表示。

对于 %g/%G 而言,精度为所有数字的总数,例如:123.45,%.4g 会打印123.5,(而 %6.2f 会打印123.45)。

%e 和 %f 的默认精度为6

对大多数的数值类型而言,宽度为输出的最小字符数,如果必要的话会为已格式化的形式填充空格。

而以字符串类型,精度为输出的最大字符数,如果必要的话会直接截断。

<think>嗯,用户问的是Go语言中printf占位符使用。我需要先回忆一下相关知识,确保自己记得正确。首先,Go的fmt包里的Printf函数,占位符的用法和C语言类似,但有些差异。可能需要分类型来介绍,比如通用占位符、整数、字符串、布尔值这些。 用户可能是刚开始学习Go,或者在使用过程中遇到了格式化输出的问题。需要详细但不过于复杂地解释各个占位符的作用,最好能举例子,这样更直观。比如%v和%+v的区别,还有%#v会输出Go语法表示的值,这些可能容易混淆。 另外,用户可能想知道不同数据类型对应的占位符,比如整数有%d,%b,%x等,浮点数有%f,%e,%g。还有宽度和精度的设置,比如%5.2f这样的用法,可能需要举例说明。 还需要注意一些特殊的占位符,比如%T输出类型,%p输出指针地址,以及%%来打印百分号。错误处理方面,如果类型和占位符不匹配会怎样,比如用%d输出字符串,这会导致错误,需要提醒用户注意。 结构体的格式化输出也是一个点,%+v会显示字段名,%#v显示结构体的类型和字段值,这对调试可能有帮助。另外,用户可能不太清楚什么时候该用哪个占位符,所以需要给出使用场景的建议。 总结一下,应该按照不同的数据类型分类,每个占位符给出例子和说明,最后再提一下常见的注意事项,比如类型匹配和宽度精度的使用。这样结构清晰,用户容易查找和理解。</think>在Go语言中,`fmt.Printf` 函数的占位符使用规则与C语言类似,但有一些扩展特性。以下是常用占位符的说明和示例: --- ### **通用占位符** | 占位符 | 说明 | 示例 | |--------|--------------------------------|--------------------------| | `%v` | 默认格式输出(自动类型推导) | `Printf("%v", 123)` → `123` | | `%+v` | 输出结构体时会添加字段名 | `{Name:"Alice", Age:20}` | | `%#v` | 输出Go语法表示的值 | `[]int{1, 2}` | | `%T` | 输出值的类型 | `int` | | `%%` | 输出百分号 | `%%` → `%` | --- ### **整型占位符** | 占位符 | 说明 | 示例 | |--------|------------------------|--------------------------| | `%d` | 十进制整数 | `255` → `255` | | `%b` | 二进制 | `5` → `101` | | `%o` | 八进制 | `8` → `10` | | `%x` | 十六进制(小写字母) | `255` → `ff` | | `%X` | 十六进制(大写字母) | `255` → `FF` | | `%c` | Unicode字符 | `65` → `A` | | `%U` | Unicode格式 | `'A'` → `U+0041` | --- ### **浮点数占位符** | 占位符 | 说明 | 示例 | |--------|---------------------------|--------------------------| | `%f` | 十进制浮点数 | `3.1415` → `3.141500` | | `%e` | 科学计数法(小写e) | `1000.0` → `1.000000e+03`| | `%E` | 科学计数法(大写E) | `1000.0` → `1.000000E+03`| | `%g` | 自动选择最短表示法 | `3.1415` → `3.1415` | --- ### **字符串与字节** | 占位符 | 说明 | 示例 | |--------|------------------------|--------------------------| | `%s` | 字符串 | `"hello"` → `hello` | | `%q` | 带引号的字符串 | `"Go"` → `"Go"` | | `%x` | 十六进制小写(每字节) | `"Go"` → `476f` | | `%X` | 十六进制大写(每字节) | `"Go"` → `476F` | --- ### **布尔值** | 占位符 | 说明 | 示例 | |--------|----------------|--------------------------| | `%t` | 输出 `true/false` | `true` → `true` | --- ### **指针与内存地址** | 占位符 | 说明 | 示例 | |--------|--------------------|--------------------------| | `%p` | 指针地址(十六进制)| `&x` → `0xc0000160a0` | --- ### **宽度与精度控制** - **语法**:`%[宽度].[精度]动词` - `%5d`:整数占5字符宽度(右对齐) - `%-5d`:左对齐 - `%05d`:用0填充空位 → `00123` - `%.2f`:保留2位小数 → `3.14` - `%6.2f`:总宽度6,小数2位 → ` 3.14` --- ### **示例代码** ```go package main import "fmt" func main() { // 通用占位符 fmt.Printf("%v %T\n", 3.14, 3.14) // 3.14 float64 // 结构体 type User struct { Name string; Age int } u := User{"Alice", 20} fmt.Printf("%+v\n", u) // {Name:Alice Age:20} // 宽度与精度 fmt.Printf("|%6.2f|%6s|\n", 3.1415, "Hi") // | 3.14| Hi| } ``` --- ### **注意事项** 1. **类型匹配**:错误占位符会导致编译错误(如用`%d`输出字符串) 2. **性能优化**:频繁调用`Printf`时建议使用`fmt.Sprintf`生成字符串 3. **扩展功能**:可通过实现`String() string`方法自定义类型的`%v`输出 通过合理组合占位符,可以灵活控制输出格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值