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