想问一下关于reflect反射的问题

//code a
vc := reflect.ValueOf(contro)
vc.MethodByName("Test").Call...

//code b
reflectVal := reflect.ValueOf(contro)
t := reflect.Indirect(reflectVal).Type()
vc := reflect.New(t)
vc.MethodByName("Test").Call...

想请教一下两段代码都能call成功 区别在什么地方 谢谢

共 5 个回复


stevewang

第二段代码是新创建一个对象并调用它的方法,不会影响到原有对象。

package main

import(
    "fmt"
    "reflect"
)

type T struct {
    count int
}

func (t *T) Inc() {
    t.count++
}

func main() {
    var t = &T{100}
    var i interface{} = t
    v1 := reflect.ValueOf(i)
    v1.MethodByName("Inc").Call(nil)
    fmt.Println(t.count)

    v2 := reflect.New(reflect.Indirect(v1).Type())
    v2.MethodByName("Inc").Call(nil)
    fmt.Println(t.count)
}
# 1

sneermorn

明白了 多谢大神指点

# 2

sneermorn

我还想问一下 reflect.Indirect(v1).Type() 和 reflect.TypeOf(i)有什么区别?

# 3

stevewang

你看下reflect.Indirect的函数说明就知道了。
如果v1对应的实际类型是指针,就需要通过reflect.Indirect获取指针指向的类型。

# 4