2016-05-14 10 views
13

"Go in Action"の執筆者は、 "2つの異なるタイプの値は、互換性があっても互いに割り当てることはできません"と書いています。なぜ変数に異なる型の値を割り当てることができますか?

たとえば、Durationint64またはint64Durationに割り当てることはできません。これら二つの状況の違いは何

type X []int 
var v []int = X([]int{1, 2, 3}) 

X値が自動的に[]intに変換されるように

しかし、これは常に真ではありません、以下の割り当てが働くだろうか?

答えて

11

私はあなたがspecを参照し、ここで最も意味のある行を抜粋ます:

値xが型Tの変数に割り当て可能である(「xはTに割り当て可能である」)これらのいずれかに例は:

...

  • のxの型VとTは、同一の基礎となる型とVの少なくとも一つを持っているか、Tは、名前付きの型ではありません。

あなたの例では基本的なタイプは、それぞれのケースについて[]intあると[]intは、名前付きの型が、スライスではありません。 intは実際(ユニバースブロックに事前宣言)という名前のタイプを構成するであろうとその下型としての地位を有するであろうが、[]int詳細なhereと命名タイプではない:数値ブールの

名前付きインスタンス、及び文字列タイプは です。複合型(配列、構造体、ポインタ、関数、 のインタフェース、スライス、マップ、チャネル型)は、タイプ リテラルを使用して構築できます。

各タイプTには基本型があります。Tが事前宣言された ブール型、数値型、文字列型、または型リテラルのいずれかである場合、 に対応する基底型はT自体です。それ以外の場合、Tの基底型の が、Tがそのタイプの 宣言で参照する型の基礎となる型です。

あなたがtype X intを作ってみました場合はそのため、あなたはintが名前付きの型であると仕様で与えられたassignability基準を満たしていないだろうとvar v intに割り当てることができないだろう。

関連する問題