ZBLOG

Golang fmt.Sprintf

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助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?