Go Refletion 反射

Type

我们可以通过Tyepof来获取变量的值,但要区分type和kind,前者表示真实类型(静态类型),后者表示基础结构(底层类型)

type X int 

func main(){
    var a X=100
    t:=reflect.TypeOf(a)

    fmt.Println(t.Name(),t.Kind())
}

输出:

X int

方法Elem返回指针、数组、切片、字典(值)或通道的类型

func main(){
    fmt.Println(reflect.TypeOf(map[string]int{}).Elem())
    fmt.Println(reflect.TypeOf([]int32{}).Elem())
}

输出:

int
int32

Value

《The way to Go》中的一段代码:
通过反射来遍历struct

package main
import (
    "fmt"
    "reflect"
)
type NotknownType struct {
    s1, s2, s3 string
}
var secret interface{} = NotknownType{"Ada", "Go", "Oberon"}
func main() {
    value := reflect.ValueOf(secret)
    for i := 0; i < value.NumField(); i++ {
        fmt.Printf("Field %d: %v\n", i, value.Field(i))
        //也可以将value的值输出出来,当必须是类型一致,如
        fmt.Println(value.Field(i).String())
    }
}
type inter int
    var x inter=45
    var y float64 = 3.4


    fmt.Println("type:", reflect.TypeOf(x)) //reflect.TypeOf includes an empty interface
    //When we call reflect.TypeOf(x), x is first stored in an empty interface, which is then passed as the argument;
    fmt.Println("value:", reflect.ValueOf(x))
    fmt.Println("type:", reflect.TypeOf(y))

    //Both reflect.Type and reflect.Value have lots of methods to let us examine and manipulate them
    v := reflect.ValueOf(y) //得到Valueof变量
    fmt.Println("type:", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())

    var z uint8 = 'x'
    h := reflect.ValueOf(z)
    fmt.Println("type:", h.Type())                            // uint8.
    fmt.Println("kind is uint8: ", h.Kind() == reflect.Uint8) // true.
    fmt.Println(h.Uint())          
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,501评论 1 46
  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,128评论 0 3
  • 第一次知道反射的时候还是许多年前在学校里玩 C# 的时候。那时总是弄不清楚这个复杂的玩意能有什么实际用途……然后发...
    勿以浮沙筑高台阅读 1,143评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,776评论 0 7