ZBLOG

Golang fmt.Sprintf

Golang fmt.Sprintf 详解

fmt.Sprintf 是 Go 语言中用于格式化字符串的函数,它根据指定的格式将数据转换为字符串并返回结果。

基本语法

  1. 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. 基本使用

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. name := "Alice"
  7. age := 25
  8. // %s - string, %d - decimal integer
  9. str := fmt.Sprintf("Name: %s, Age: %d", name, age)
  10. fmt.Println(str) // Name: Alice, Age: 25
  11. // %% - literal percent sign
  12. percent := fmt.Sprintf("Discount is %.1f%%", float64(15))
  13. fmt.Println(percent) // Discount is15.0%
  14. }

2. Float精度控制

  1. pi := math.Pi
  2. str := fmt.Sprintf("Pi with default precision: %f\n"+
  3. "Pi with precision=2: %.2f\n"+
  4. "Scientific notation: %.4e",
  5. pi, pi, pi)
  6. /*
  7. Pi with default precision:3.141593
  8. Pi with precision=2:3.14
  9. Scientific notation:3.1416e+00
  10. */

3. Struct 格式化

  1. type User struct {
  2. Name string
  3. Age int
  4. }
  5. user := User{"Bob",30}
  6. // Default format (without field names)
  7. str1:=fmt.Sprintf("User:%v",user) // User:{Bob30}
  8. // Include field names (+v)
  9. str2:=fmt.Sprintf("User:%+v",user) // User:{Name:BobAge30}
  10. // Go syntax representation (#v)
  11. str3:=fmt.Sprintf("User:%#v",user) // User:**main**.User{Name:"Bob"**,**Age**:**30}

4. 宽度与对齐

  1. name :="Alice"
  2. score:=95
  3. // Right-align in space of width10
  4. rightAligned:=fmt.Sprintf("%10s:%5d","Name:",score)
  5. // Left-align in space of width10
  6. leftAligned:=fmt.Sprintf("%-10s:%5d","Score:",score)
  7. /*
  8. Right-aligned:
  9. Name**:****95**
  10. Left-aligned:
  11. Score :****95**
  12. */

5. Slice/Array/Maps

  1. nums:=[]int{1 ,2 ,3 }
  2. sliceStr:=fmt.Sprint(nums)//[123]
  3. mapData:=map[string]int{"a":1,"b":2}
  4. mapStr:=fmt.Sprint(mapData)// map[a :1 b :2 ]

高级用法

1. 自定义类型Stringer接口实现

如果类型实现了String()方法,Sprintf会自动调用:

  1. type Point struct{X,Y float64}
  2. func(p Point )String()string {
  3. return fmt .Sprint ("(",p.X ,"," ,p.Y,")" )
  4. }
  5. p :=Point {7 .2 ,4 .8 }
  6. pointStr :=fmt .Sprint (p )// (7 .24 .8 )

2. 动态构建格式字符串

可以在运行时构造格式字符串:

  1. formatFunc :=func(precision int )string {
  2. return "%." + strconv.Itoa(precision)+"f"
  3. }
  4. num :=math.Pi
  5. result :=fmt.Sprint(fmtFunc(4),num)//3.1416

性能考虑

  • Sprintf会进行反射操作,性能不如直接拼接简单字符串。
  • 对于高性能场景,可考虑使用strings.Builder或bytes.Buffer。

例如:

  1. var b strings.Builder
  2. b.WriteString("Hello")
  3. b.WriteString(name)
  4. result = b.String()

总之,fmt.Sprint是Go中最常用的字符串格式化工具之一,灵活掌握各种verb可以满足大部分日常开发需求。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23775

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?