Simple, elegant, and intuitive callers, copiers, getters and setters.
In the following example, we have a pointer to any
that stores a struct
,
instead of having a direct pointer to a struct
.
The receiver is a pointer, so eventually we cannot call the given method.
Caller
handles that by creating a pointer to a copy of that value.
type Person struct {
name string
age int
}
func (p *Person) SetName(n string) {
p.name = n
}
func Example() {
var p any
p := &Person{age: 25}
_, _ = caller.CallMethod(p, "SetName", []any{"Mary"}, false)
fmt.Printf("%+v\n", p)
// Output: &{name:Mary age:25}
}
var (
from = []any{int(1), uint(2), float32(3), float64(4)}
to []uint64
)
_ = copier.Copy(from, &to, true) // convert
fmt.Printf("%#v\n", to)
// Output: []uint64{0x1, 0x2, 0x3, 0x4}
In the following example, we read an unexported field of the given struct.
person := struct {
name string
}{
name: "Mary",
}
v, _ := getter.Get(person, "name")
fmt.Println(v)
// Output: Mary
In the following example, we have a pointer to any
that stores a struct
,
instead of having a direct pointer to a struct
. Since it is an unaddressable value
,
the reflect
package from the standard library does not allow assigning a new value to this field.
Setter
handles that by creating an addressable copy.
var person any
person = struct {
name string
}{}
_ = setter.Set(&person, "name", "Mary", false)
fmt.Println(person)
// Output: {Mary}