m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

go言語の学習:interface型の値設定について

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

まとめ

構造体とか定義せずにいい感じのデータ型が混ざったやつって定義したいなぁぁぁぁ