2016-04-11 4 views
5

私は、明示的な型変換なしで実際の型割り当てに名前付き型を許可していないと思った。golangは明示的な型変換なしで名前付きスライスタイプの割り当てを許可するのはなぜですか?

[]bytejson.RawMessageを割り当てても、エラーなしでどのようにコンパイルされますか?

var a json.RawMessage // type RawMessage []byte 
var b []byte 

a = b 

var x time.Duration // type Duration int64 
var y int64 

x = y // ERROR: cannot use y (type int64) as type time.Duration in assignment 

https://play.golang.org/p/oD5LwJl7an

+2

参照。 http://stackoverflow.com/questions/19334542/why-can-i-type-alias-functions-and-use-them-without-casting – LibertyLocked

+0

@LibertyLocked int64は名前付きの型ですか?その背後にある実際のタイプは何ですか? – woodings

+0

バイト配列は既存の型 'byte'から構成されますが、' byte'自体は型リテラルであり、既存の型から構成されていません – LibertyLocked

答えて

4

int64[]byteがunamedタイプで、名前付きの型です。

名前付き型は、(場合によっては修飾された)型名で指定されます。そのタイプ名が同じTypeSpecに由来する場合も

2つの名前付きの型が同一であるgolang spec

- 無名の種類は、既存のタイプから新しいタイプを構成するリテラル型を使用して指定されています。名前付きの型と名前のない型は、常に異なっています。 2つの無名型は、対応する型リテラルが同一である場合、つまり、それらが同じリテラル構造を持ち、対応するコンポーネントが同じ型を持つ場合、同一です。 - INTは、名前付きの型と配列が名前型であるためgolang spec

したがって

type MyByteArray []byte 
type MyInt int 

var a MyByteArray 
var b []byte 
a = b // legal because array is unnamed - their corresponding type literals are identical 

var x MyInt 
var y int 
x = y // illegal because int is named - they don't originate in the same type spec 

またWhy can I type alias functions and use them without casting?

関連する問題