1 回答
TA贡献1744条经验 获得超4个赞
永远不要使用指向接口的指针。如果您需要一个指针来调用带有指针接收器的方法,则必须将指针放入interface{}.
如果您已经在interface{}要使用指针接收器调用方法的地方拥有值,则需要制作该值的可寻址副本。
你想要完成i = &i的可能是:
item := i.(Item)
i = &item
这将创建原始的可寻址副本Item,然后将指向该副本的指针放入i. 请注意,这永远无法更改原始 的值Item。
如果您不知道 中可以包含的类型,则可以interface{}使用“reflect”复制该值:
func nextVal(i interface{}) {
// get the value in i
v := reflect.ValueOf(i)
// create a pointer to a new value of the same type as i
n := reflect.New(v.Type())
// set the new value with the value of i
n.Elem().Set(v)
// Get the new pointer as an interface, and call NextVal
fmt.Println("NextVal:", n.Interface().(NextValuer).NextVal())
// this could also be assigned another interface{}
i = n.Interface()
nv, ok := i.(NextValuer)
fmt.Printf("i is a NextValuer: %t\nNextVal: %d\n", ok, nv.NextVal())
}
http://play.golang.org/p/gbO9QGz2Tq
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报