片上接口的Golang开关盒

片上接口的Golang开关盒,go,interface,switch-statement,slice,Go,Interface,Switch Statement,Slice,在开关情况下,是否可以区分[]接口{}和接口{} 尝试创建一个解码函数,在该函数中,您可以传入不同的类型,然后开关盒确定该类型,然后继续解码该特定类型。尽管当传递的类型是[]接口{}时我遇到了问题 我一直在试验reflect软件包,但到目前为止运气不佳。 请参阅下面的代码片段和链接 package main import ( "fmt" "math/big" ) type Test struct { t interface{} } func main()

在开关情况下,是否可以区分[]接口{}和接口{}

尝试创建一个解码函数,在该函数中,您可以传入不同的类型,然后开关盒确定该类型,然后继续解码该特定类型。尽管当传递的类型是[]接口{}时我遇到了问题

我一直在试验reflect软件包,但到目前为止运气不佳。 请参阅下面的代码片段和链接

package main

import (
    "fmt"
    "math/big"
)

type Test struct {
    t      interface{}
}

func main() {
    testVar1 := big.NewInt(0)
    testVar2 := int64(1)
    testVar3 := []byte("test")
    testVar4 := true
    testVar5 := []int{1, 2, 3, 4}
    var testVar6 Test

    Issue(testVar1)
    Issue(testVar2)
    Issue(testVar3)
    Issue(testVar4)
    Issue(testVar5)
    Issue(testVar6)
}

func Issue(t interface{}) {
    switch t.(type) {
    case *big.Int:
        fmt.Println("*big.Int")
    case int8, int16, int32, int64:
        fmt.Println("int8, int16, int32, int64")
    case []byte:
        fmt.Println("[]byte")
    case bool:
        fmt.Println("bool")
    case []interface{}:
        fmt.Println("how to get testVar5 to print here")
        fmt.Println("[]interface{}")
    case interface{}:
        fmt.Println("interface{}")
    default:
        fmt.Println("unsupported type")
    }
}
结果:

*big.Int
int8, int16, int32, int64
[]byte
bool
interface{}
interface{}
有没有办法让testVar5命中[]接口{}案例

有没有办法让testVar5命中[]接口{}案例

不可以。请参见例如

您可以像这样使用reflect软件包:

package main

import (
    "fmt"
    "math/big"
    "reflect"
)

type Test struct {
    t      interface{}
}

func main() {
    testVar1 := big.NewInt(0)
    testVar2 := int64(1)
    testVar3 := []byte("test")
    testVar4 := true
    testVar5 := []int{1, 2, 3, 4}
    var testVar6 Test

    Issue(testVar1)
    Issue(testVar2)
    Issue(testVar3)
    Issue(testVar4)
    Issue(testVar5)
    Issue(testVar6)
}

func Issue(t interface{}) {
    switch t.(type) {
    case *big.Int:
        fmt.Println("*big.Int")
    case int8, int16, int32, int64:
        fmt.Println("int8, int16, int32, int64")
    case []byte:
        fmt.Println("[]byte")
    case bool:
        fmt.Println("bool")
    case interface{}:
        rt := reflect.TypeOf(t)
        switch rt.Kind() {
        case reflect.Slice:
            fmt.Println("Slice")
        case reflect.Array:
            fmt.Println("Array")
        default:
            fmt.Println("interface{}")
        }
    default:
        fmt.Println("unsupported type")
    }
}

这是一个非常常见的问题,目前我找不到确切的答案,但简而言之,[]someType不能用于预期[]someInterface的地方,即使someType实现了someInterface。因此,[]int与switch语句中的[]接口{}不匹配。