interface型は基本的にはどんな値も設定できる
package main import ( "fmt" ) func main() { fmt.Println("start") var a interface{} a = int(10) a = int64(10) a = string(65) fmt.Printf("%+v\n", a) fmt.Println("end") }
設定はできる…
しかし、そのままでは文字列連結や加算、減算などはできないようになっている感じ
型変換
package main import ( "fmt" ) func main() { fmt.Println("start") var a interface{} a = int(10) a = a.(int) * 100 fmt.Printf("%+v\n", a) fmt.Println("end") }
「変数.(設定されている値のデータ型)」でその値へ変換してくれます
リフレクションでinterfaceに設定されたデータ型を確認できる
package main import ( "fmt" "reflect" ) func main() { fmt.Println("start") var a interface{} var v reflect.Value a = int(10) v = reflect.ValueOf(a) fmt.Printf("a(type): %+v\n", v.Type()) a = int64(100) v = reflect.ValueOf(a) fmt.Printf("a(type): %+v\n", v.Type()) a = "aaaaaaaaaa" v = reflect.ValueOf(a) fmt.Printf("a(type): %+v\n", v.Type()) fmt.Printf("%+v\n", a) fmt.Println("end") }
↓
start a(type): int a(type): int64 a(type): string aaaaaaaaaa end
まとめ
構造体とか定義せずにいい感じのデータ型が混ざったやつって定義したいなぁぁぁぁ