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

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