如何确定接口切片中的值类型{}
How to determine type of values in a slice of interface{}
考虑以下代码:
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]
如何确定 interface{} 片段中包含的元素类型,在这个特定示例中,我需要在我的函数 f
中知道该 interface{} 片段包含 string
值。
我的用例是,使用反射,我试图根据我的 interface{} 参数切片所持有的值类型设置一个结构字段。
您传入的值是 []interface{}
类型,因此元素类型将为 interface{}
。如果要查看元素类型是什么,则需要单独考虑这些元素:
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)
}
}
如果您知道您将始终拥有 []interface{}
,请将其用作参数类型以简化迭代和类型检查:
func f(things []interface{}) {
for _, thing := range things {
v := reflect.ValueOf(thing)
fmt.Println(v.Type())
fmt.Println(v)
}
}
考虑以下代码:
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]
如何确定 interface{} 片段中包含的元素类型,在这个特定示例中,我需要在我的函数 f
中知道该 interface{} 片段包含 string
值。
我的用例是,使用反射,我试图根据我的 interface{} 参数切片所持有的值类型设置一个结构字段。
您传入的值是 []interface{}
类型,因此元素类型将为 interface{}
。如果要查看元素类型是什么,则需要单独考虑这些元素:
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)
}
}
如果您知道您将始终拥有 []interface{}
,请将其用作参数类型以简化迭代和类型检查:
func f(things []interface{}) {
for _, thing := range things {
v := reflect.ValueOf(thing)
fmt.Println(v.Type())
fmt.Println(v)
}
}