Golang fmt.Sprintf 详解
fmt.Sprintf
是 Go 语言中用于格式化字符串的函数,它根据指定的格式将数据转换为字符串并返回结果。
基本语法
func Sprintf(format string, a ...interface{}) string
format
: 格式化字符串,包含普通文本和格式化动词(verbs)a ...interface{}
: 可变参数,用于替换格式化字符串中的占位符- 返回值: 格式化后的字符串
常用格式化动词
动词 | 说明 | 示例 |
---|---|---|
%v |
默认格式的值 | Sprintf("%v", user) → {Name:Alice Age:25} |
%+v |
打印结构体时包含字段名 | Sprintf("%+v", user) → {Name:Alice Age:25 Email:} |
%#v |
Go语法表示的值 | Sprintf("%#v", user) → main.User{Name:"Alice", Age:25} |
%T |
值的类型 | Sprintf("%T", user) → main.User |
%% |
百分号字面量 |
基础类型格式化
类型 | 动词 |
---|---|
bool | %t |
int | %d |
float | %f, %g, %e |
string | %s |
pointer | %p |
使用示例
1. 基本使用
package main
import (
"fmt"
)
func main() {
name := "Alice"
age := 25
// %s - string, %d - decimal integer
str := fmt.Sprintf("Name: %s, Age: %d", name, age)
fmt.Println(str) // Name: Alice, Age: 25
// %% - literal percent sign
percent := fmt.Sprintf("Discount is %.1f%%", float64(15))
fmt.Println(percent) // Discount is15.0%
}
2. Float精度控制
pi := math.Pi
str := fmt.Sprintf("Pi with default precision: %f\n"+
"Pi with precision=2: %.2f\n"+
"Scientific notation: %.4e",
pi, pi, pi)
/*
Pi with default precision:3.141593
Pi with precision=2:3.14
Scientific notation:3.1416e+00
*/
3. Struct 格式化
type User struct {
Name string
Age int
}
user := User{"Bob",30}
// Default format (without field names)
str1:=fmt.Sprintf("User:%v",user) // User:{Bob30}
// Include field names (+v)
str2:=fmt.Sprintf("User:%+v",user) // User:{Name:BobAge30}
// Go syntax representation (#v)
str3:=fmt.Sprintf("User:%#v",user) // User:**main**.User{Name:"Bob"**,**Age**:**30}
4. 宽度与对齐
name :="Alice"
score:=95
// Right-align in space of width10
rightAligned:=fmt.Sprintf("%10s:%5d","Name:",score)
// Left-align in space of width10
leftAligned:=fmt.Sprintf("%-10s:%5d","Score:",score)
/*
Right-aligned:
Name**:****95**
Left-aligned:
Score :****95**
*/
5. Slice/Array/Maps
nums:=[]int{1 ,2 ,3 }
sliceStr:=fmt.Sprint(nums)//[123]
mapData:=map[string]int{"a":1,"b":2}
mapStr:=fmt.Sprint(mapData)// map[a :1 b :2 ]
高级用法
1. 自定义类型Stringer接口实现
如果类型实现了String()方法,Sprintf会自动调用:
type Point struct{X,Y float64}
func(p Point )String()string {
return fmt .Sprint ("(",p.X ,"," ,p.Y,")" )
}
p :=Point {7 .2 ,4 .8 }
pointStr :=fmt .Sprint (p )// (7 .24 .8 )
2. 动态构建格式字符串
可以在运行时构造格式字符串:
formatFunc :=func(precision int )string {
return "%." + strconv.Itoa(precision)+"f"
}
num :=math.Pi
result :=fmt.Sprint(fmtFunc(4),num)//3.1416
性能考虑
- Sprintf会进行反射操作,性能不如直接拼接简单字符串。
- 对于高性能场景,可考虑使用strings.Builder或bytes.Buffer。
例如:
var b strings.Builder
b.WriteString("Hello")
b.WriteString(name)
result = b.String()
总之,fmt.Sprint是Go中最常用的字符串格式化工具之一,灵活掌握各种verb可以满足大部分日常开发需求。
内容由零声教学AI助手提供,问题来源于学员提问