Skip to main content

One post tagged with "field"

View All Tags

ยท 2 min read

ใ‚ใ‚‹ๆง‹้€ ไฝ“ใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ‚’ๅพ—ใ‚ˆใ†ใจๅฎŸ่ฃ…ใ—ใŸใ‚‰ใ€ใชใœใ‹็ถ™ๆ‰ฟๅ…ƒ(Goใงใฏใ“ใ†่จ€ใ‚ใชใ„ใ‹)ใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใ—ใ‹ๅ–ๅพ—ใงใใชใ‹ใฃใŸใ€‚ ๆง‹้€ ไฝ“ใ‚’ๅผ•ๆ•ฐใซๅฎŸ่กŒใ™ใ‚Œใฐๅ–ๅพ—ใงใใ‚‹ใ‘ใฉใ€ๅŒใ˜ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใ‚“ใงใ„ใ‚‹ใฎใ ใŒโ€ฆใ€‚

ใ“ใ‚Œใฏใฉใ†็†่งฃใ—ใŸใ‚‰ใ„ใ„ใฎใ‹ใ‚ใ‹ใ‚‰ใชใ„ใ€‚

http://play.golang.org/p/KcfBp2myhR
package main

import (
"fmt"
"reflect"
)

type I interface {
Call()
Method(interface{})
}

type A struct {
a1 bool
}

func (a *A) Call() {
a.Method(a)
}

func (a *A) Method(i interface{}) {
ip := reflect.ValueOf(i)
iv := ip.Elem()
fmt.Println("name:", iv.Type().Name())
for ii := 0; ii < iv.NumField(); ii++ {
fmt.Println(iv.Field(ii))
}
}


type B struct {
A
b1 int
b2 float32
b3 bool
}

func main() {
var bi interface{}
bi = &B{}
t := reflect.TypeOf(bi).Elem()
b := reflect.New(t)
i, _ := b.Interface().(I)

fmt.Println("----- invoke 'Method' via 'Call'. -----")
i.Call()
fmt.Println("----- invoke direct 'Method'. -----")
i.Method(i)
}

/*
----- invoke 'Method' via 'Call'. -----
name: A
&lt;bool Value&gt;
----- invoke direct 'Method'. -----
name: B
&lt;main.A Value&gt;
&lt;int Value&gt;
&lt;float32 Value&gt;
&lt;bool Value&gt;
*/