Корпус переключателя Golang на интерфейсах слайсов - PullRequest
0 голосов
/ 27 февраля 2019

Можно ли провести различие между []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 голосов
/ 27 февраля 2019

вы можете использовать пакет 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")
    }
}
0 голосов
/ 27 февраля 2019

Есть ли способ заставить testVar5 попасть в кейс [] interface {}?

Нет.См. Например https://golang.org/doc/faq#convert_slice_of_interface

...