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()
ています。任意のオブジェクトを呼び出して、その文字列表現を取得するだけです。