go - 写入接口的函数{}

时间:2015-08-15 12:21:13

标签: pointers go

我想将指针传递给函数,在编译时不知道它的类型,让函数写入它。这就是我认为可行的方法:

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 {})

我在这里做错了什么?

3 个答案:

答案 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)
        }
    }
}

example