Go 如何确定接口{}切片中的值类型

Go 如何确定接口{}切片中的值类型,go,reflection,reflect,Go,Reflection,Reflect,考虑以下代码: package main import ( "fmt" "reflect" ) func f(v interface{}) { fmt.Println(reflect.TypeOf(v).Elem()) fmt.Println(reflect.ValueOf(v)) } func main() { var aux []interface{} aux = make([]interface{}, 2) aux[0] = "f

考虑以下代码:

package main

import (
    "fmt"
    "reflect"
)

func f(v interface{}) {
    fmt.Println(reflect.TypeOf(v).Elem())
    fmt.Println(reflect.ValueOf(v))
}
func main() {
    var aux []interface{}
    aux = make([]interface{}, 2)
    aux[0] = "foo"
    aux[1] = "bar"
    f(aux)
}
输出为:

interface {}
[foo bar]
如何确定接口{}片中包含的元素类型,在这个特定示例中,我需要在函数f中知道接口{}片中包含字符串值


我的用例是,使用反射,我试图根据接口{}参数的切片所持有的值的类型设置一个结构字段。

您传入的值是[]接口{}类型,因此元素类型将是接口{}。如果要查看元素类型是什么,则需要分别考虑这些类型:

func f(i interface{}) {
    v := reflect.ValueOf(i)
    for i := 0; i < v.Len(); i++ {
        e := v.Index(i)
        fmt.Println(e.Elem().Type())
        fmt.Println(e)
    }
}

谢谢我并不总是知道我会有一个[]接口{}作为参数,所以第一个解决方案工作得很好。不过,我还有一个后续问题。既然我知道这个接口片段包含字符串,我如何将值打包到一个字符串片段中?为此,我尝试设置类型为[]string的struct字段的值。我尝试过使用makeSlice,但是失败了,因为我想要打包的值是interface{}类型的。如果您知道要查找特定类型,那么应该使用类型断言,而不是反射。即使您使用反射,您仍然必须断言类型以将它们放入具有该特定类型的变量中。您可以使用类型断言和反射,但实际上:尽量避免使用接口{}
func f(things []interface{}) {
    for _, thing := range things {
        v := reflect.ValueOf(thing)
        fmt.Println(v.Type())
        fmt.Println(v)
    }
}