You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:15:45