I think this 40 second snippet of a talk by Rob Pike 
<https://www.youtube.com/watch?v=PAAkCSZUG1c&feature=youtu.be&t=15m21s> is 
apropos. It is not specific to your case, but speaks of reflection in 
general.

On Thursday, January 18, 2018 at 5:20:26 PM UTC-5, Boone Severson wrote:
>
> Ok, asked and answered. Figuring out .Addr() was a key, as was finding the 
> magic incantation to get a handle to a method. I'm curious if there's a 
> better method.
>
> https://play.golang.org/p/49Yj9G0egRI
>
> package main
>
> import (
> "fmt"
> "reflect"
> )
>
> type FooTypeA uint8
> type FooTypeB uint8
>
> type MyStruct struct {
> Foo FooTypeA
> Bar FooTypeB
> }
>
> func (mt *FooTypeA) Validate() bool {
> return *mt > 1
> }
> func (mt *FooTypeB) Validate() bool {
> return *mt > 0
> }
>
> func (ms *MyStruct) Validate() bool {
> s := reflect.ValueOf(ms).Elem()
>
> // Call Validate on all fields
> for i := 0; i < s.NumField(); i++ {
>
> f := s.Field(i).Addr()
> method, _ := f.Type().MethodByName("Validate")
> outs := method.Func.Call([]reflect.Value{f})
> if !outs[0].Bool() {
> return false
> }
> }
> return true
> }
>
> func main() {
>
> mytype := &MyStruct{
> Foo: FooTypeA(2),
> Bar: FooTypeB(5),
> }
>
> fmt.Println("what is mytype? ", mytype)
>
> if !mytype.Validate() {
> fmt.Println("Validation failed")
> }
> }
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to