Slice接口上的Golang开关盒

问题描述 投票:-2回答:2

是否有可能在开关案例中区分[]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

go interface switch-statement slice
2个回答
0
投票

有没有办法让testVar5进入[]接口{}案例?

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


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")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.