如何让Go语言结构体切片过滤结果按指定格式输出?
如何在Go中格式化结构体切片输出为指定样式?
你当前通过fmt.Printf("%+v")输出的是紧凑单行格式,要实现带缩进、换行且name字段用单引号的目标格式,有两种可行方案:
方案一:利用encoding/json包快速实现
Go的encoding/json包提供的MarshalIndent方法可直接生成带缩进的格式化输出,只需将结构体字段改为首字母大写(导出字段),再替换双引号为单引号即可:
import ( "encoding/json" "fmt" "strings" ) type Data struct { ID int `json:"id"` // 用tag指定json键名,保持输出为小写id Name string `json:"name"` Age int `json:"age"` } func FilterData() { var people = []Data{ {ID: 1, Name: "Udin", Age: 12}, {ID: 2, Name: "Wati", Age: 51}, {ID: 3, Name: "Budi", Age: 34}, {ID: 4, Name: "Agus", Age: 16}, {ID: 5, Name: "Sari", Age: 19}, {ID: 6, Name: "Ririn", Age: 21}, } var result = []Data{} for _, item := range people { if item.Age < 21 { result = append(result, item) } } // 生成带2空格缩进的json格式数据 output, err := json.MarshalIndent(result, "", " ") if err != nil { fmt.Println("格式化失败:", err) return } // 替换双引号为单引号,匹配需求格式 fmt.Println(strings.ReplaceAll(string(output), "\"", "'")) } func main() { FilterData() }
输出结果:
[ { id: 1, name: 'Udin', age: 12 }, { id: 4, name: 'Agus', age: 16 }, { id: 5, name: 'Sari', age: 19 }, ]
方案二:自定义格式化函数(无需导出字段)
如果不想修改结构体字段的可见性(保持小写),可以手动拼接字符串实现完全自定义的格式:
import ( "fmt" "strings" "strconv" ) type data struct { id int name string age int } func formatDataSlice(slice []data) string { var sb strings.Builder sb.WriteString("[\n") for _, item := range slice { sb.WriteString(" { id: ") sb.WriteString(strconv.Itoa(item.id)) sb.WriteString(", name: '") sb.WriteString(item.name) sb.WriteString("', age: ") sb.WriteString(strconv.Itoa(item.age)) sb.WriteString(" },\n") } sb.WriteString("]") return sb.String() } func FilterData() { var people = []data{ {id: 1, name: "Udin", age: 12}, {id: 2, name: "Wati", age: 51}, {id: 3, name: "Budi", age: 34}, {id: 4, name: "Agus", age: 16}, {id: 5, name: "Sari", age: 19}, {id: 6, name: "Ririn", age: 21}, } var result = []data{} for _, item := range people { if item.age < 21 { result = append(result, item) } } fmt.Println(formatDataSlice(result)) } func main() { FilterData() }
输出结果和需求完全一致。
两种方案对比:
- 方案一代码简洁,利用标准库快速实现,但要求结构体字段导出;
- 方案二灵活性更高,可完全控制输出细节,无需修改原有结构体定义。
内容的提问来源于stack exchange,提问作者purple hippo
相关产品推荐
相关产品推荐

