Skip to content
Initialize structs with default values
Go Makefile
Branch: master
Clone or download
Latest commit c58e679 Jun 20, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
internal/fixture Test edge cases Feb 11, 2018
.gitignore Add ignore Apr 21, 2017
.travis.yml Update go version Jan 28, 2019
LICENSE
Makefile Fix test Apr 21, 2017
README.md Improve readme Jun 21, 2019
defaults.go Prevent empty slice init Jan 28, 2019
defaults_test.go
setter.go Fix Feb 11, 2018

README.md

defaults

Build Status codecov GitHub release License

Initialize structs with default values

  • Supports almost all kind of types
    • Scalar types
      • int/8/16/32/64, uint/8/16/32/64, float32/64
      • uintptr, bool, string
    • Complex types
      • map, slice, struct
    • Aliased types
      • time.Duration
      • e.g., type Enum string
    • Pointer types
      • e.g., *SampleStruct, *int
  • Recursively initializes fields in a struct
  • Dynamically sets default values by defaults.Setter interface
  • Preserves non-initial values from being reset with a default value

Usage

type Gender string

type Sample struct {
	Name   string `default:"John Smith"`
	Age    int    `default:"27"`
	Gender Gender `default:"m"`

	Slice       []string       `default:"[]"`
	SliceByJSON []int          `default:"[1, 2, 3]"` // Supports JSON
	Map         map[string]int `default:"{}"`
	MapByJSON   map[string]int `default:"{\"foo\": 123}"`

	Struct    OtherStruct  `default:"{}"`
	StructPtr *OtherStruct `default:"{\"Foo\": 123}"`

	NoTag  OtherStruct               // Recurses into a nested struct by default
	OptOut OtherStruct `default:"-"` // Opt-out
}

type OtherStruct struct {
	Hello  string `default:"world"` // Tags in a nested struct also work
	Foo    int    `default:"-"`
	Random int    `default:"-"`
}

// SetDefaults implements defaults.Setter interface
func (s *OtherStruct) SetDefaults() {
	if defaults.CanUpdate(s.Random) { // Check if it's a zero value (recommended)
		s.Random = rand.Int() // Set a dynamic value
	}
}
obj := &Sample{}
if err := defaults.Set(obj); err != nil {
	panic(err)
}
You can’t perform that action at this time.