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
}
结果: