7

I thought go didn't allow any named type to actual type assignment without explicit type conversion.

But how does it compile without an error if I assign []byte to json.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

sberry
  • 128,281
  • 18
  • 138
  • 165
woodings
  • 7,503
  • 5
  • 34
  • 52
  • 2
    Because int is a named type and array is an unnamed type. See http://stackoverflow.com/questions/19334542/why-can-i-type-alias-functions-and-use-them-without-casting – libertylocked Apr 11 '16 at 17:40
  • @LibertyLocked Is int64 a named type? what's the actual type behind it? – woodings Apr 11 '16 at 17:54
  • byte array is a composed from an existing type, `byte`, while `byte` itself is a type literal, not composed from any existing type – libertylocked Apr 11 '16 at 17:56

1 Answers1

6

int64 is a named type, []byte is an unamed type.

Named types are specified by a (possibly qualified) type name; unnamed types are specified using a type literal, which composes a new type from existing types - golang spec

Also

Two named types are identical if their type names originate in the same TypeSpec. A named and an unnamed type are always different. Two unnamed types are identical if the corresponding type literals are identical, that is, if they have the same literal structure and corresponding components have identical types. - golang spec

Therefore

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

Also see Why can I type alias functions and use them without casting?

Community
  • 1
  • 1
libertylocked
  • 892
  • 5
  • 15