我想将指针传递给函数,在编译时不知道它的类型,让函数写入它。这就是我认为可行的方法:
func foo(dest interface{}) {
switch (dest).(type) {
case *int:
fmt.Println("got int")
*dest = 1
// handle other cases...
}
}
但是,使用*int
输入
func main() {
bar := 2
foo(&bar)
fmt.Println(bar) // expect 1
}
产生编译器错误
invalid indirect of dest (type interface {})
。
我在这里做错了什么?
答案 0 :(得分:6)
在这段代码中(顺便说一下,你不需要dest
周围的parens),一旦你输入一个案例,你基本上就忘记了这个类型:
func foo(dest interface{}) {
switch dest.(type) {
case *int:
fmt.Println("got int")
*dest = 1
// handle other cases...
}
}
也就是说,根据编译器,dest仍然是类型interface {},这会导致*dest = 1
错误。
你可以使用更多类型的断言......
func foo(dest interface{}) {
switch dest.(type) {
case *int:
fmt.Println("got int")
*dest.(*int) = 1
// handle other cases...
}
}
...但实际上“记住”该类型的开关会更好(来自Effective Go)
func foo(dest interface{}) {
switch dest := dest.(type) {
case *int:
fmt.Println("got int")
*dest = 1
// handle other cases...
}
}
答案 1 :(得分:0)
dest仍为interface{}
类型。你也必须在任务期间施放它:
*dest.(*int) = 1
答案 2 :(得分:0)
这个问题看起来有点陈旧,但我采用了一种更通用的方式来处理这种反射,它没有其他解决方案那么快,但它适用于你传递给函数的任何其他类型
func foo(dest interface{}) {
destVal := reflect.ValueOf(dest)
val := reflect.ValueOf(1)
if destVal.Kind() == reflect.Ptr && destVal.Elem().Kind() == val.Kind() {
if destElem := destVal.Elem(); destElem.CanSet() {
destElem.Set(val)
}
}
}