Go library for addressing and reading/writing a specific value within any Go structure using a string syntax.
MIT License
pointerstructure is a Go library for identifying a specific value within any Go structure using a string syntax.
pointerstructure is based on JSON Pointer (RFC 6901), but reimplemented for Go.
The goal of pointerstructure is to provide a single, well-known format for addressing a specific value. This can be useful for user provided input on structures, diffs of structures, etc.
Get the value for an address
Set the value for an address within an existing structure
Delete the value at an address
Sorting a list of addresses
Standard go get
:
$ go get github.com/mitchellh/pointerstructure
For usage and examples see the Godoc.
A quick code example is shown below:
complex := map[string]interface{}{
"alice": 42,
"bob": []interface{}{
map[string]interface{}{
"name": "Bob",
},
},
}
value, err := pointerstructure.Get(complex, "/bob/0/name")
if err != nil {
panic(err)
}
fmt.Printf("%s", value)
// Output:
// Bob
Continuing the example above, you can also set values:
value, err = pointerstructure.Set(complex, "/bob/0/name", "Alice")
if err != nil {
panic(err)
}
value, err = pointerstructure.Get(complex, "/bob/0/name")
if err != nil {
panic(err)
}
fmt.Printf("%s", value)
// Output:
// Alice
The library also supports Get
operations on structs including using the pointer
struct tag to override struct field names:
input := struct {
Values map[string]interface{} `pointer:"embedded"`
}{
Values: map[string]interface{}{
"alice": 42,
"bob": []interface{}{
map[string]interface{}{
"name": "Bob",
},
},
},
}
value, err := Get(input, "/embedded/bob/0/name")
if err != nil {
panic(err)
}
fmt.Printf("%s", value)
// Output:
// Bob