Slice接口上的Golang开关盒

时间:2019-02-27 18:05:11

标签: go interface switch-statement slice

在切换情况下是否可以区分[]interface{}interface{}

尝试创建一个解码函数,您可以在其中传递不同的类型,然后由开关盒确定该类型,然后继续对该特定类型进行解码。尽管在传递类型为[]interface{}时遇到问题。

我一直在尝试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打败[]interface{}案?

https://play.golang.org/p/U0dJF9CEbTX

2 个答案:

答案 0 :(得分:1)

您可以像这样使用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")
    }
}

答案 1 :(得分:0)

  

有什么方法可以使testVar5打到[] interface {}的情况下?

不。参见例如https://golang.org/doc/faq#convert_slice_of_interface