码迷,mamicode.com
首页 > 其他好文 > 详细

Go reflect

时间:2015-09-20 06:54:18      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

package main

import (
        "fmt"
        "reflect"
)

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())


        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind())
}

TypeOf()  与 ValueOf 得到的值调用Type() 返回结果是一样的

但ValueOf得到的值调用Kind()可能一样,因为如果是第二种情况(指针情况), vv.Kind() 打印出来是ptr,而不是 *string

 

 

package main

import (
        "fmt"
        "reflect"
)

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())


        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind(), " vv.Elem=", vv.Elem())// vv.Elem() 返回hello world
        elem := vv.Elem()
        fmt.Println("valueof.CanSet=", vv.CanSet(), " valueof.Elem.CanSet=", elem.CanSet())//第一个返回false,第二个返回true
}

 

 

 

type T struct {
        A int
        B string
}

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())


        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind(), " vv.Elem=", vv.Elem())
        elem := vv.Elem()
        fmt.Println("valueof.CanSet=", vv.CanSet(), " valueof.Elem.CanSet=", elem.CanSet())

        fmt.Println("******************************")
        t := T {A:123, B:"hello world"}
        vf := reflect.ValueOf(&t)
        fmt.Println("typeof(t)=", reflect.TypeOf(t), " vf.Type=", vf.Type(), " vf.Kind=", vf.Kind()) //typeof(t)= main.T  vf.Type= *main.T  vf.Kind= ptr

        ee := vf.Elem()
        eet := ee.Type()
        for i := 0; i < ee.NumField(); i ++ {
                f := ee.Field(i)
                fmt.Printf("%s %s  = %v\n", eet.Field(i).Name, f.Type(), f.Interface()) //A int  = 123
        }

        fmt.Printf("%v  %v", eet, ee)//main.T  {123 hello world}
}
                                                                                                                      

 

 

Go 依赖注入里用到reflect:

https://github.com/codegangsta/inject 

Go reflect

标签:

原文地址:http://www.cnblogs.com/kuipertan/p/4822758.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!