1

在 Go 中,为了迭代一个数组/切片,你会写这样的东西:

for _, v := range arr {
    fmt.Println(v)
}

但是,我想迭代包含不同类型(int、float64、string 等)的数组/切片。在 Python 中,我可以这样写:

a, b, c = 1, "str", 3.14
for i in [a, b, c]:
    print(i)

我怎样才能在 Go 中做这样的工作?据我所知,数组和切片都应该只允许相同类型的对象,对吧?(比如说,[]int只允许int类型对象。)

谢谢。

4

1 回答 1

5

由于 Go 是一种静态类型语言,因此不会像 Python 那样简单。您将不得不求助于类型断言、反射或类似方法。

看看这个例子:

package main

import (
    "fmt"
)

func main() {
    slice := make([]interface{}, 3)
    slice[0] = 1
    slice[1] = "hello"
    slice[2] = true

    for _, v := range slice {
        switch v.(type) {
        case string:
            fmt.Println("We have a string")
        case int:
            fmt.Println("That's an integer!")
            // You still need a type assertion, as v is of type interface{}
            fmt.Printf("Its value is actually %d\n", v.(int))
        default:
            fmt.Println("It's some other type")
        }
    }
}

这里我们构造了一个空接口类型的切片(任何类型都实现它),进行类型切换并根据结果处理值。

不幸的是,在处理未指定类型的数组(空接口)的任何地方都需要这个(或类似的方法)。此外,您可能需要为每种可能的类型提供一个案例,除非您有办法处理您可以获得的任何对象。

一种方法是使您要存储的所有类型都实现您的某个接口,然后仅通过该接口使用这些对象。这就是fmt处理泛型参数的一种方式——它只是调用String()任何对象来获取其字符串表示。

于 2013-08-24T09:35:33.313 回答