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)
}
注意事项
- 对于CSV格式,必须传递可迭代接口(如slice),不能处理单个结构体
- XML格式仅支持基础库支持的结构体
- 使用GoTemplate时,可以自定义输出格式,非常灵活
这个库非常适合需要在命令行工具中提供多种输出格式的场景,可以大大简化开发工作。
更多关于golang命令行应用中结构体多格式输出插件库go-output-format的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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 来格式化输出结构体数据,主要特点包括:
- 支持多种输出格式:JSON、YAML、XML、表格
- 易于与现有 CLI 应用集成
- 提供表格输出的自定义选项
- 支持输出到文件或标准输出
- 良好的错误处理
这个库特别适合需要提供多种输出格式选择的命令行工具,让用户可以自由选择最适合他们需求的格式。