Go library for struct serialization, diffing, change tracking, and default injection with nested struct, pointer, slice, and encoding support.
- ✅ Encode/decode struct to string or binary
- 🔄 Flatten dan unflatten nested struct
- 📆 Inject default values to struct
- 🕵️ Struct diffing and history tracking
- ⟳ Copy between structs with different shapes
go get github.com/Lucifer07/StructotypeAddressstruct {
Citystring`json:"city"`ZipCodestring`json:"zipCode"`
}
typeMetadatastruct {
Activebool`json:"active"`Versionstring`json:"version"`
}
typeUserstruct {
IDintNamestringEmail*stringTags []stringMetadataMetadataAddress*Address
}conv:=structo.NewConverter()
encoded:=conv.EncodeToString(user)
conv.DecodeFromString(encoded, &user)bin:=conv.StructToBinary(user)
conv.BinaryToStruct(bin, &user)encoded:=conv.EncodeToStringSafe(user)
conv.DecodeFromStringSafe(encoded, &user)flat:=structo.Flatten(user)
// map[string]any: {"Name":"Jane", "Address.City":"Jakarta", ...}varuUserstructo.Unflatten(flat, &u)diff, _:=structo.Diff(oldUser, newUser)
forfield, values:=rangediff {
fmt.Printf("%s: %v -> %v\n", field, values[0], values[1])
}changes, _:=structo.TrackWithHistory(oldUser, newUser)
forfield, res:=rangechanges {
switchres.Action {
casestructo.Add:
fmt.Printf("%s: appended %v\n", field, res.Data.GetData())
casestructo.Remove:
fmt.Printf("%s: removed %v\n", field, res.Data.GetData())
casestructo.Change:
data:=res.Data.GetData().([]any)
fmt.Printf("%s: changed from %v to %v\n", field, data[0], data[1])
}
}varexternalExternalUserstructo.Copy(&external, user)typeProfilestruct {
Namestring`default:"Anonymous"`Ageint`default:"18"`Emailstring`default:"default@example.com"`
}
varpProfilestructo.InjectDefaults(&p)
// p.Name = "Anonymous", etc.view the example/main.go file for full example, runnable example.
MIT © Lucifer07
Contributions are welcome! Feel free to open issues and pull requests to improve Structo.
🔥 Enjoy fast and secure struct serialization with Structo!