老男孩IT教育,只培养技术精英

全国免费咨询电话:400-609-2893
Go语言反射操作应用 如何操作?老男孩go

    /    2019-04-10

反射操作应用

一、通过反射操作基本类型,来改变基本类型的值。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a int = 1
    a = 100
    val := reflect.ValueOf(&a)
    val.Elem().SetInt(200)
    b := val.Elem().Int()
    fmt.Printf("a => %d , b => %d\n", a, b)
}

运行结果:

a => 200 , b => 200

二、反射操作结构体及调用结构体方法。

package main

import (
    "fmt"
    "reflect"
)

type School struct {
    Name   string
    Course string
}

func (s School) Echo() {
    fmt.Printf("name : %s , Course : %s \n", s.Name, s.Course)
}

func main() {
    o := School{
        Name:   "oldboy",
        Course: "Linux",
    }

    val := reflect.ValueOf(&o)
    kd := val.Kind()

    if kd != reflect.Ptr && val.Elem().Kind() == reflect.Struct {
        fmt.Println("expect struct")
        return
    }
    //获取字段数量
    fields := val.Elem().NumField()
    fmt.Printf("struct has %d field\n", fields)
    //获取字段的类型
    for i := 0; i < fields; i++ {
        fmt.Printf("%d %v\n", i, val.Elem().Field(i).Kind())
    }
    // 操作结构体
    val.Elem().Field(1).SetString("Golang")

    //获取方法数量
    methods := val.NumMethod()
    fmt.Printf("struct has %d methods\n", methods)

    //反射调用的Echo方法
    var params []reflect.Value
    val.Elem().Method(0).Call(params)
}

运行结果:

struct has 2 field
0 string
1 string
struct has 1 methods
name : oldboy , Course : Golang


反射综合应用

1、定义一个结构体

2、给结构体赋值

3、用反射获取结构体的下标、结构体名称、类型、值

4、改变结构体的值

package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    Name string
    Age  int
}

func main() {
    u := Student{"oldboy"18}
    v := reflect.ValueOf(&u).Elem()
    t := v.Type()
    for i := 0; i < v.NumField(); i++ {
        f := v.Field(i)
        fmt.Printf("构体的下标: %d: 名称: %s 类型: %s 值: %v\n", i,
            t.Field(i).Name, f.Type(), f.Interface())
    }
    v.Field(0).SetString("老男孩")
    v.Field(1).SetInt(100)
    fmt.Println("u is now", u)
}


更多内容请关注公众号:Go程序员开发


(2)

分享至