gpt4 book ai didi

go - 如何检查接口(interface){}是否是一个 slice

转载 作者:IT王子 更新时间:2023-10-29 01:17:41 27 4
gpt4 key购买 nike

我是 Go 的菜鸟 :) 所以我的问题可能很愚蠢,但找不到答案,所以。

我需要一个函数:

func name (v interface{}) {
if is_slice() {
for _, i := range v {
my_var := i.(MyInterface)
... do smth
}
} else {
my_var := v.(MyInterface)
... do smth
}
}

如何在 Go 中执行 is_slice?感谢任何帮助。

最佳答案

在你的例子中是 type switch是最简单方便的解决方案:

func name(v interface{}) {
switch x := v.(type) {
case []MyInterface:
fmt.Println("[]MyInterface, len:", len(x))
for _, i := range x {
fmt.Println(i)
}
case MyInterface:
fmt.Println("MyInterface:", x)
default:
fmt.Printf("Unsupported type: %T\n", x)
}
}

case 分支枚举了可能的类型,在它们里面 x 变量已经是那个类型了,所以你可以这样使用它。

测试它:

type MyInterface interface {
io.Writer
}

var i MyInterface = os.Stdout
name(i)
var s = []MyInterface{i, i}
name(s)
name("something else")

输出(在 Go Playground 上尝试):

MyInterface: &{0x1040e110}
[]MyInterface, len: 2
&{0x1040e110}
&{0x1040e110}
Unsupported type: string

对于单个类型检查,您还可以使用 type assertion :

if x, ok := v.([]MyInterface); ok {
// x is of type []MyInterface
for _, i := range x {
fmt.Println(i)
}
} else {
// x is not of type []MyInterface or it is nil
}

还有其他方法,使用包reflect你可以写一个更通用(和更慢)的解决方案,但如果你刚刚开始使用 Go,你不应该深入研究反射。

关于go - 如何检查接口(interface){}是否是一个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com