zoukankan      html  css  js  c++  java
  • Go reflect反射

    Go语言中的反射非常强大,可以对string, int, struct, func...进行反射,使用起来也比较简单。

    示例1:反射函数

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func Hello() {
        fmt.Println("hello world!")
    }
    
    func main() {
        valueOf := reflect.ValueOf(Hello)
        valueOf.Call(nil)
    }

    示例2:反射带参数的函数

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func Print(str ...string) {
        fmt.Println("str=", str)
    }
    func main() {
        valueOf := reflect.ValueOf(Print)
        i := make([]reflect.Value, 3)
        i[0] = reflect.ValueOf("1")
        i[1] = reflect.ValueOf("2")
        i[2] = reflect.ValueOf("3")
    
        valueOf.Call(i)
    }

    示例3: 结构体反射,实现Struct to Json的转换

    package main
    
    import (
        "reflect"
        "fmt"
    )
    
    type User struct {
        Name string `json:"name"`
        Age int
        Sex string
    }
    
    func TestType(a interface{}) {
        typeOf := reflect.TypeOf(a)
        fmt.Printf("typeof = %v
    ", typeOf)
        kind := typeOf.Kind()
        switch kind {
        case reflect.Int:
            fmt.Println("a is an int")
        case reflect.String:
            fmt.Println("a is a string")
        }
    }
    
    func TestValue(a interface{}) {
        valueOf := reflect.ValueOf(a)
        switch valueOf.Kind() {
        case reflect.Ptr:
            i := valueOf.Elem().Type()
            switch i.Kind() {
            case reflect.Int:
                valueOf.Elem().SetInt(10000)
            case reflect.String:
                valueOf.Elem().SetString("hello world")
            }
        }
    }
    
    func Marshal(a interface{}) {
        valueOf := reflect.ValueOf(a)
        typeOf := valueOf.Type()
        jsonStr := ""
        switch typeOf.Kind() {
        case reflect.Struct:
            numField := typeOf.NumField()
            for i:=0; i<numField; i++ {
                structField := typeOf.Field(i)
                valueField := valueOf.Field(i)
                name := structField.Name
                if structField.Tag.Get("json") != "" {
                    name = structField.Tag.Get("json")
                }
                if valueField.Type().Kind() == reflect.String {
                    jsonStr += fmt.Sprintf("  "%s": "%v"", name, valueField.Interface())
                } else {
                    jsonStr += fmt.Sprintf("  "%s": %v", name, valueField.Interface())
    
                }
                if numField - i > 1 {
                    jsonStr += ",
    "
                }
            }
            jsonStr = "{
    " + jsonStr + "
    }"
        }
        fmt.Printf("%s", jsonStr)
    }
    
    func main() {
        var a int
        TestType(a)
    
        var b string
        TestType(b)
    
        TestValue(&a)
        TestValue(&b)
    
        fmt.Println(a, b)
    
        var user User
        user.Name = "alex"
        user.Age = 100
        user.Sex = "man"
        Marshal(user)
    }

    参考文章:https://studygolang.com/articles/896

  • 相关阅读:
    html5 audio的语法以及属性和方法
    转自可可英语的文章,以激励我努力学习英语。
    Linux下怎么删除非空目录
    Unity脚本时间执行顺序
    一个高手很多同时又能学习英语的问答网站
    Unity中Time.deltaTime的含义及其应用
    用C++画心(转)
    web中将body占满整个页面的办法
    基于FPGA的LCD+CMOS视频采集显示使用小结
    基于iCamera测试500w摄像头-mt9p001,mt9p031,mt9p001模块小结
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9534794.html
Copyright © 2011-2022 走看看