片上接口的Golang开关盒
在开关情况下,是否可以区分[]接口{}和接口{} 尝试创建一个解码函数,在该函数中,您可以传入不同的类型,然后开关盒确定该类型,然后继续解码该特定类型。尽管当传递的类型是[]接口{}时我遇到了问题 我一直在试验reflect软件包,但到目前为止运气不佳。 请参阅下面的代码片段和链接片上接口的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()
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语句中的[]接口{}不匹配。