golang命令行应用中结构体多格式输出插件库go-output-format的使用

Golang命令行应用中结构体多格式输出插件库go-output-format的使用

介绍

gout(原go-output-format)是一个Go语言输出格式化工具,用于以标准化方式序列化数据结构。它可以帮助你以多种格式输出数据结构,类似于Vault、az和kubectl等工具提供的灵活输出功能。

安装

import "github.com/drewstinnett/gout/v2"

内置实例使用

Gout现在提供了一个内置实例,类似于Viper的工作方式。

示例代码:

gout.MustPrint(struct {
  FirstName string
  LastName  string
}{
  FirstName: "Bob",
  LastName:  "Ross",
})

自定义实例使用

示例代码:

// 创建新实例
w, err := gout.New()
if err != nil {
  panic(err)
}

// 使用自定义写入器
w.SetWriter(os.Stderr)

// 打印内容
w.MustPrint(struct {
  FirstName string
  LastName  string
}{
  FirstName: "Bob",
  LastName:  "Ross",
})
// 输出: {"FirstName":"Bob","LastName":"Ross"}

内置格式支持

YAML

使用标准的gopkg.in/yaml.v3库。

JSON

使用标准的encoding/json库。

TOML

使用github.com/pelletier/go-toml/v2库。

CSV

使用github.com/jszwec/csvutil库。注意:使用此格式时必须传递可迭代接口,不能处理单个结构体。

XML

使用encoding/xml库。注意:此插件仅适用于基础库支持的结构体。

Plain

这是普通的Go语言输出,使用%+v格式。

GoTemplate

使用此格式将数据解析为Go模板。这对于以更任意格式输出数据很有用。它使用text/template包来解析返回切片中的每个项目。

完整示例

以下是一个完整的示例,展示如何使用gout库以不同格式输出结构体:

package main

import (
	"os"

	"github.com/drewstinnett/gout/v2"
)

type Person struct {
	FirstName string
	LastName  string
	Age       int
}

func main() {
	// 创建数据
	people := []Person{
		{"Bob", "Ross", 52},
		{"John", "Doe", 30},
	}

	// 使用内置实例输出JSON
	gout.MustPrint(people)

	// 创建自定义实例
	w, _ := gout.New()
	
	// 设置输出为YAML格式
	w.SetFormat("yaml")
	w.MustPrint(people)

	// 设置输出为表格格式
	w.SetFormat("csv")
	w.MustPrint(people)

	// 使用Go模板自定义输出
	w.SetFormat("gotemplate")
	w.SetTemplate(`{{range .}}{{.FirstName}} {{.LastName}} ({{.Age}})
{{end}}`)
	w.MustPrint(people)
}

注意事项

  1. 对于CSV格式,必须传递可迭代接口(如slice),不能处理单个结构体
  2. XML格式仅支持基础库支持的结构体
  3. 使用GoTemplate时,可以自定义输出格式,非常灵活

这个库非常适合需要在命令行工具中提供多种输出格式的场景,可以大大简化开发工作。


更多关于golang命令行应用中结构体多格式输出插件库go-output-format的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang命令行应用中结构体多格式输出插件库go-output-format的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-output-format 使用指南

go-output-format 是一个用于 Golang 命令行应用的结构体多格式输出插件库,它允许开发者轻松地将结构体数据以多种格式(如 JSON、YAML、XML、表格等)输出。

安装

go get github.com/golobby/output/v3

基本用法

1. 定义结构体

首先定义一个需要输出的结构体:

type User struct {
    ID       int    `json:"id" yaml:"id" xml:"id"`
    Name     string `json:"name" yaml:"name" xml:"name"`
    Email    string `json:"email" yaml:"email" xml:"email"`
    IsActive bool   `json:"is_active" yaml:"is_active" xml:"is_active"`
}

2. 初始化输出器

import "github.com/golobby/output/v3"

func main() {
    user := User{
        ID:       1,
        Name:     "John Doe",
        Email:    "john@example.com",
        IsActive: true,
    }

    // 创建输出器实例
    out := output.New()
}

3. 不同格式输出

JSON 格式输出

err := out.PrintJSON(user)
if err != nil {
    log.Fatal(err)
}

YAML 格式输出

err := out.PrintYAML(user)
if err != nil {
    log.Fatal(err)
}

XML 格式输出

err := out.PrintXML(user)
if err != nil {
    log.Fatal(err)
}

表格格式输出

err := out.PrintTable(user)
if err != nil {
    log.Fatal(err)
}

4. 根据用户输入动态选择格式

func printUser(user User, format string) error {
    out := output.New()
    
    switch format {
    case "json":
        return out.PrintJSON(user)
    case "yaml":
        return out.PrintYAML(user)
    case "xml":
        return out.PrintXML(user)
    case "table":
        return out.PrintTable(user)
    default:
        return fmt.Errorf("unsupported format: %s", format)
    }
}

高级用法

自定义表格输出

err := out.PrintTable(user, output.TableConfig{
    Title:       "User Information",
    Border:      true,
    BorderStyle: output.BorderStyleSingle,
    Columns: []output.TableColumn{
        {Header: "ID", Field: "ID"},
        {Header: "Full Name", Field: "Name"},
        {Header: "Email Address", Field: "Email"},
        {Header: "Status", Field: "IsActive", Formatter: func(val interface{}) string {
            if val.(bool) {
                return "Active"
            }
            return "Inactive"
        }},
    },
})

输出到文件

file, err := os.Create("output.json")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

err = out.FprintJSON(file, user)
if err != nil {
    log.Fatal(err)
}

输出切片数据

users := []User{
    {ID: 1, Name: "John Doe", Email: "john@example.com", IsActive: true},
    {ID: 2, Name: "Jane Smith", Email: "jane@example.com", IsActive: false},
}

err := out.PrintTable(users)
if err != nil {
    log.Fatal(err)
}

与 Cobra 集成示例

如果你使用 Cobra 构建 CLI 应用,可以这样集成:

var format string

var cmd = &cobra.Command{
    Use:   "show-user",
    Short: "Display user information",
    Run: func(cmd *cobra.Command, args []string) {
        user := getUser() // 获取用户数据
        
        out := output.New()
        var err error
        
        switch format {
        case "json":
            err = out.PrintJSON(user)
        case "yaml":
            err = out.PrintYAML(user)
        case "xml":
            err = out.PrintXML(user)
        case "table":
            err = out.PrintTable(user)
        default:
            err = fmt.Errorf("unsupported format: %s", format)
        }
        
        if err != nil {
            log.Fatal(err)
        }
    },
}

func init() {
    cmd.Flags().StringVarP(&format, "format", "f", "table", "Output format (json, yaml, xml, table)")
}

总结

go-output-format 提供了简单易用的 API 来格式化输出结构体数据,主要特点包括:

  1. 支持多种输出格式:JSON、YAML、XML、表格
  2. 易于与现有 CLI 应用集成
  3. 提供表格输出的自定义选项
  4. 支持输出到文件或标准输出
  5. 良好的错误处理

这个库特别适合需要提供多种输出格式选择的命令行工具,让用户可以自由选择最适合他们需求的格式。

回到顶部