Go Go's Reflect

crazyjin · 2013年12月06日 · 最后由 crazyjin 回复于 2013年12月06日 · 8698 次阅读

我匿名组合了一个指针

type Type1 struct {
}

type Type2 struct {
    *Type1
}

type Type3 struct {
  *Type1
}

现在有很多类型 Type2,Type3……都匿名组合了一个*Type1 我用一个 var i interface{} 来装这些类型(Type2 Type3……)的实例,我现在怎样才能为 i 的*Type1 赋值?

我的代码是这样的写的:

v := reflect.ValueOf(i) f := v.FieldByName("Type1") v.SetPointer(unsafe(&Type1{})

得到错误: reflect: call of reflect.Value.SetPointer on zero Value

谢谢各位的回帖,我的问题最终是这样的:

package p1 type Type1 struct{ } /package p1 end/

pckage p2 import "p1" type Type2 struct{ *p1.Type1 }

我在用 FieldByName 查找 Type2 的匿名组合的指针时用的名字是"p1.Type1",实际上不应该包含包名而直接用“Type1”查找就 OK 了。

#1 楼 @search 我需要 reflect 特性啊。我更新了帖子,表达得更清楚了。

#2 楼 @crazyjin 为啥要用 reflec

你只说有错误,也没有说是什么代码导致了错!

#3 楼 @search 用 reflect 是因为要根据输入来调用不同对象的不同的方法,而这些对象有很多共同的特性,我就申明了一个类型来实现这些特性,然后再匿名组合,这样比较省事。

package main

import (
    "fmt"
    "reflect"
)

type Type1 struct {
    A int
}

type Type2 struct {
    *Type1
}

func setValue(v interface{}) {
    value := reflect.ValueOf(v)
    field := value.Elem().FieldByName("Type1")

    t := &Type1{123456789}
    field.Set(reflect.ValueOf(t))
}

func main() {
    t := Type2{}
    setValue(&t)
    fmt.Println(t.A)
}

#5 楼 @zhangjinzhu 这个正是我需要的效果。谢谢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号