如何理解两个命名类型在golang中是相同的

时间:2013-11-20 07:14:47

标签: types go

type identity的规则规定:

Two named types are identical if their type names originate in the same TypeSpec

我不太明白两个类型名称是如何在同一个TypeSpec中产生的。你能解释一下或给我看一个例子吗?

2 个答案:

答案 0 :(得分:7)

只有一个类型名称可以来自TypeSpec。这就是重点。所以

type Foo int64
var x Foo
var y Foo

然后两个Foo都来自同一个TypeSpec,因此它们是相同的Foo s。

但是,如果您有两个不同的文件(在不同的包中):

a.go:

type Foo int64
var x Foo

b.go:

type Foo int64
var y Foo

然后在这种情况下两个Foo不相同。即使它们是相同的类型名称,它们也来自不同的TypeSpecs。这样做的结果是xy的类型不相同(因此不允许在没有强制转换的情况下x = y。)

答案 1 :(得分:0)

Two named types are identical if their type names originate in the same TypeSpec

实际上,在Go代码中不能有两个相同的命名类型。因为在Go代码中,originate in the same TypeSpec表示相同的类型。说一种类型与自身相同是毫无意义的。

但是我们确实有不同的命名类型,它们是相同的:byte和uint8;根据,符文和int32 the spec

只能在编译器中为预先声明的类型执行此操作。

请参阅the discussion in golang nuts

注意: 在Go 1.9中,将会有一个名为:type alias / alias声明的新功能。使用此功能,可以声明相同的不同命名类型。请参阅talk about Go 1.9