自定义结构体格式化
实现 Stringer 接口
基本的 String() 方法
type Product struct {
Name string
Price float64
}
func (p Product) String() string {
return fmt.Sprintf("%s ($%.2f)", p.Name, p.Price)
}
高级格式化技术
JSON 格式化
func (p Product) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"name": p.Name,
"price": fmt.Sprintf("$%.2f", p.Price),
})
}
自定义格式化策略
graph TD
A[自定义格式化] --> B[String() 方法]
A --> C[JSON 编组]
A --> D[基于模板的格式化]
A --> E[基于反射的格式化]
格式化复杂结构体
type User struct {
ID int
Username string
Roles []string
}
func (u User) Format(f fmt.State, verb rune) {
switch verb {
case 'v':
f.Write([]byte(fmt.Sprintf(
"User(id=%d, name=%s, roles=%v)",
u.ID, u.Username, u.Roles
)))
}
}
格式化选项比较
方法 |
灵活性 |
性能 |
使用场景 |
String() |
高 |
中等 |
简单的自定义格式化 |
MarshalJSON() |
非常高 |
较慢 |
复杂的序列化 |
fmt.Formatter |
最高 |
快 |
高级自定义打印 |
格式化中的错误处理
func (p Product) SafeString() string {
if p.Price < 0 {
return "Invalid Product"
}
return fmt.Sprintf("%s ($%.2f)", p.Name, p.Price)
}
性能考虑
graph TD
A[格式化性能] --> B[缓存格式化]
A --> C[最小化分配]
A --> D[避免反射]
B --> E[重用缓冲区]
C --> F[优化内存使用]
最佳实践
- 保持格式化方法简单
- 避免在 String() 方法中使用复杂逻辑
- 根据不同上下文使用适当的格式化
- 考虑性能影响
示例:条件格式化
func (u User) DisplayFormat(detailed bool) string {
if detailed {
return fmt.Sprintf(
"User Details:\nID: %d\nUsername: %s\nRoles: %v",
u.ID, u.Username, u.Roles
)
}
return u.Username
}
借助 LabEx,你可以掌握这些自定义结构体格式化技术,并通过实现灵活高效的格式化方法来提高你的 Go 编程技能。