【问题标题】:Golang Switch Case on Slice Interfaces切片接口上的 Golang Switch Case
【发布时间】:2019-07-21 13:13:58
【问题描述】:

是否可以在 switch case 中区分 []interface{}interface{}

尝试创建一个解码函数,您可以在其中传递不同的类型,然后一个 switch case 确定类型,然后继续解码该特定类型。虽然当传递的类型是[]interface{} 时我遇到了问题。

我一直在尝试reflect 包,但到目前为止还没有运气。 请参阅下面的代码 sn-p 和游乐场链接。

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

【问题讨论】:

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

标签: go interface switch-statement slice


【解决方案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")
    }
}

【讨论】:

    【解决方案2】:

    有什么方法可以让 testVar5 达到 []interface{} 的情况吗?

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

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多