update.最近型ではまることがたびたびあったのでまとめてみました。下記についてまとめています。型アサーションreflectパッケージの使い方インターフェースの実装などについては触れていません。代入の可否など名前の有無で動作に違いのあるケースがある。下記のようにtypeを使って宣言されている型は名前のある型。int型をもとにしてMyIntと言う名前の型を宣言したboolやintなどは事前に宣言されている名前のある型。事前に宣言されている名前の型は以下の通り。型の名前と記号を組み合わせて表現されている型は名前のない型。literal)と呼ばれている。次のようなものは名前のない型。[3]bytemap[string]stringinterface{}宣言により名前のない型に名前をつけることができる。type)を持っている。boolやintのような事前に宣言されている型や型リテラルの基礎型はその型自身。それ以外の場合、基礎型は宣言時に指定された型の基礎型となる。//T4の基礎型はT3の基礎型の[]T1変数の型とインターフェースvarを使って変数の名前とその型を宣言することができる。type)または単に型という。後述するように、基本的にはある型の変数に値を代入する場合、変数の型と値の型が一致している必要がある。string型に整数は代入できない一つの変数にいろいろ型の値を代入できると便利な場合がある。文字列だけでなく数値なども引数にとることができ、文字列以外の値を直接使用することができる。いうインターフェース型となっている。error)このようにインターフェース型の変数にはいろいろな型の値を格納することができる。動的な型は実行中に変化する可能性がある。vの(静的な)型はinterface{}、動的な型はstringreflectを使って型についての情報を得るreflectパッケージを使用すると以下の例のように変数の型についての情報を取得することができる。Typeメソッドで型の名前、Kindメソッドで値の種類を取得することができる。intインターフェース型の変数にreflectを使用した場合には動的な型の情報を取得できる。値を格納していない場合にはTypeメソッドを含めほとんどのメソッドがpanicを起こすので注意が必要。値を格納しているか否かはIsValidメソッドでチェックできる。インターフェース型の変数に値が格納されていないことと、インターフェース型にnilが格納されていること(下記のようにnilポインタが格納されている場合など)は別なので注意。fmt.Println()}代入のルール下記のいずれかの条件を満たしている場合に変数に値を代入できる。変数の値として表現可能な型なし定数を代入する場合いくつか例を上げてみます。整数を表す型同士でも異なる型であれば代入できない。基礎型が同じでも変数と値の型が異なっている場合には代入できない。値が代入先のインターフェース型を実装していれば代入可能。名前のない型については、基礎型が一致していれば代入できる。逆にMap1型からmap[string]string型の変数にも代入可能。m1Go言語には型がある定数とない定数がある。型がある場合の代入のルールは通常の変数と同じ。型がない場合、定数が変数の型で表現可能であればその型として代入できる。fmt.Println(myb)}型の変換と型アサーション型を変換したい場合には、大きく分けて次の場合がある。前者は型の変換で、後者は型アサーションで行うことができる。型の変換(conversion)は以下の記法で行うことができる。型の名前(式)以下のいずれかの条件を満たす場合に、値xを型Tに変換可能できる。assertion)と呼ばれる次の記法で、インターフェース型の変数xに格納されている値の型がTであることを確かめることができる。x.(T)下記の例のように、インターフェース型で包まれている値の型を取り出すようなイメージ。型アサーションによってint型の値が格納されていることを示せば代入できる型アサーションの成功条件は下記の通り。型アサーションが成功するとxに格納されている値が型Tとして返る。記法の場合panicを起こす。記法の場合にはvがT型のゼロ値、okがfalseとなる。x)}型アサーションと型の変換の違い型アサーションと変換はどちらも(静的な)型を変えると言う意味では似ているが全く別の操作。次の例でわかるように、型アサーションによって型の変換を行うことはできない。型アサーションを使えばインターフェース型の変数に格納された値の型を動的な型に変えることができます。型アサーションの書き方から分かるように、型アサーションするためには格納されている可能性のある動的な型があらかじめ分かっている必要があります。下記のような2つの数値を表す型が引数でfloat64で合計を返す関数を実装しようとした場合、MyIntのように独自に定義された型についてアサーションで対応することは困難です。MyIntには対応していない}このような場合には、reflectパッケージを利用してインターフェース型の変数から値を取得することができます。MyInt型の値が引数として渡された場合には次のように動作します。MyInt型はint型をもとにしているのでKindはIntKindがIntの場合、Intメソッドにより格納された値をint64型として取得できるint64型はfloat64型へ変換可能(Floatメソッドを使えれば楽だが、FloatメソッドはKindがFloat32かFloat64以外の場合panicを起こすので不可。50}また、MyInt型はfloat64型へ変換できる(型の変換を参照)ため、指定した型への型変換を行うConvertメソッドを使用して次のようにtoFloat関数を書くこともできます。Convertメソッドはreflect.Value型を返すので、いったんInterfaceメソッドでinteface{}型にしてから型アサーションでfloat64型にしています。0}スライスやマップとインターフェース要素として複数の型を格納できるスライスは次のように記述できる。[]interface{}ここで[]interface{}と[]float64型の間で変換する方法を考えてみる。vsそれ自体はインターフェースではないので、下記のようにそれぞれの要素毎に代入や型アサーションを行う必要がある。ys)}vsをinterface{}型とした場合には、要素ごとの操作は必要なく非常にシンプルになる。ys)}上記の例のように、返り値をインターフェース型の配列([]interface{}など)にするより、インターフェース型(interface{}など)にした方があとの処理が少なくて済む場合がある。reflectには任意の型を指定してスライスやマップを作る関数が用意されている。任意の要素xと整数nを引数にとり、要素xをn個並べたスライスを返す関数は以下のように書ける。Blog任意の型で使用できるmap関数の実装を例にしたreflectionの解説。コードが多く参考になる。GoGo言語の代入や型の変換のルールは言語仕様をみるのがおすすめ。英語があまり苦でなければ、英語の方がわかりやすいと思います。upLoginユーザーは見つかりませんでした。