go struct 设置初始值

package main

import (

	"fmt"
	"github.com/mcuadros/go-defaults"
	"time"
)

type ExampleBasic struct {
	Foo bool   `default:"true"` //<-- StructTag with a default key
	Bar string `default:"33"`
	Qux int8 `default:"3"`
	Dur time.Duration `default:"1m"`
}

func NewExampleBasic() *ExampleBasic {
	example := new(ExampleBasic)
	defaults.SetDefaults(example) //<-- This set the defaults values

	return example
}

func main() {

	test := NewExampleBasic()
	fmt.Println(test.Foo) //Prints: true
	fmt.Println(test.Bar) //Prints: 33
	fmt.Println(test.Qux) //Prints:
	fmt.Println(test.Dur) //Prints: 1m0s

}

结果:

 这个包会有点问题:SetDefaults()函数会使用结构体中定义的值覆盖自己定义对象时初始化设置的值。其官网的例子存在问题。SetDefaults函数应该传入指针,并且Bar类型为string。

package main

import (

	"fmt"
	"github.com/mcuadros/go-defaults"
	"time"
)

type ExampleBasic struct {
	Foo bool   `default:"true"` //<-- StructTag with a default key
	Bar string `default:"33"`
	Qux int8 `default:"3"`
	Dur time.Duration `default:"1m"`
}

func NewExampleBasic() *ExampleBasic {
	example := new(ExampleBasic)
	defaults.SetDefaults(example) //<-- This set the defaults values

	return example
}

func main() {

	test := NewExampleBasic()
	fmt.Println(test.Foo) //Prints: true
	fmt.Println(test.Bar) //Prints: 33
	fmt.Println(test.Qux) //Prints: 3
	fmt.Println(test.Dur) //Prints: 1m0s

	fmt.Println("----------------------------------")
	example := ExampleBasic{
		Bar: "",
	}
	defaults.SetDefaults(&example)
	fmt.Printf("Bar :%s\n", example.Bar) //Prints: 33 instead of 0 (which is zero value for int)

	example.Bar = "" // set needed zero value AFTER applying defaults
	fmt.Printf("Bar :%s\n", example.Bar) //Prints: 0
}

结果:

也可以和json一起使用:

package main

import (
	"encoding/json"
	"fmt"
	"github.com/mcuadros/go-defaults"
	"time"
)

type ExampleBasic struct {
	Foo bool   `json:"foo" default:"true"` //<-- StructTag with a default key
	Bar string `json:"bar" default:"33"`
	Qux int8 `json:"qux" default:"3"`
	Dur time.Duration `json:"dur" default:"1m"`
}

func NewExampleBasic() *ExampleBasic {
	example := new(ExampleBasic)
	defaults.SetDefaults(example) //<-- This set the defaults values

	return example
}

func main() {

	test := NewExampleBasic()
	fmt.Println(test.Foo) //Prints: true
	fmt.Println(test.Bar) //Prints: 33
	fmt.Println(test.Qux) //Prints: 3
	fmt.Println(test.Dur) //Prints: 1m0s

	data, _ :=  json.Marshal(test)
	fmt.Println(string(data))
	fmt.Println("----------------------------------")
	example := ExampleBasic{
		Qux: 0,
	}
	fmt.Println(example.Qux) //Prints: 33 instead of 0 (which is zero value for int)

	defaults.SetDefaults(&example)
	fmt.Println(example.Qux) //Prints: 33 instead of 0 (which is zero value for int)

	example.Qux = 0 // set needed zero value AFTER applying defaults
	fmt.Println(example.Qux) //Prints: 0
}

结果:


版权声明:本文为guoguangwu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。