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")
        }
    }
}

ここでは、空のインターフェイスの型 (任意の型がそれを実装します) でスライスを作成し、型の切り替えを行い、その結果に基づいて値を処理します。

残念ながら、指定されていない型 (空​​のインターフェイス) の配列を扱う場合はどこでも、これ (または同様のメソッド) が必要になります。さらに、取得できるオブジェクトを処理する方法がない限り、考えられるすべての型のケースが必要になるでしょう。

1 つの方法は、格納したいすべての型に独自のインターフェイスを実装させ、そのインターフェイスを介してそれらのオブジェクトのみを使用することです。これは、fmtが一般的な引数を処理する方法と似String()ています。任意のオブジェクトを呼び出して、その文字列表現を取得するだけです。

于 2013-08-24T09:35:33.313 に答える