golang構造体のフォーマット出力

1881 ワード

使用可能
`return fmt.Sprintf("%+v", *conf) `
をクリックして、構造体のkey値を含む構造体を印刷します.ただし,構造体は容量が多く,いずれも1行であるため,出力構造体をフォーマットできることが望ましい.
実は構造体に対応するデフォルトのjson構造を受け取って、jsonのフォーマットを行うことができます
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

type RedisConfig struct {
	IP  string
	PORT  string
	AUTH       int
	PASS string
}

type DbConfig struct {
	Host   string
	Port   int
	Uid    string
	Pwd    string
	DbName string
}

//Config         
type Config struct {
	ServerId  int  
	Port      int  //   

	Redis     *RedisConfig
	DbConfigs map[string]*DbConfig //          ,          
	callbacks []func()
}

func (conf *Config) String() string {
	b, err := json.Marshal(*conf)
	if err != nil {
		return fmt.Sprintf("%+v", *conf)
	}
	var out bytes.Buffer
	err = json.Indent(&out, b, "", "    ")
	if err != nil {
		return fmt.Sprintf("%+v", *conf)
	}
	return out.String()
}

func main(){

	conf:=Config{
		ServerId:1,
		Port:8080,
		Redis:&RedisConfig{},
		DbConfigs: map[string]*DbConfig{
			"maindb": &DbConfig{
				Host:"127.0.0.1",
			} ,
		},
	}
	fmt.Println("Config:",conf.String())

}

出力結果:
Config: {
    "ServerId": 1,
    "Port": 8080,
    "Redis": {
        "IP": "",
        "PORT": "",
        "AUTH": 0,
        "PASS": ""
    },
    "DbConfigs": {
        "maindb": {
            "Host": "127.0.0.1",
            "Port": 0,
            "Uid": "",
            "Pwd": "",
            "DbName": ""
        }
    }
}

予想通りに複雑になったのでreflect反射を利用して自分でやりたいのですが、デフォルトのjson反射はこれをやってくれて、いいですね!
 
転載先:https://www.cnblogs.com/ayanmw/p/8677453.html