Go 类型系统 #
Underlying Type
#
- 每一个类型都有自己的
Underlying Type
- 如果
T
是Pre-declared
type 或者Type Literal
,它们对应的Underlying Type
就是自身T
- 比如
type T int
的Underlying Type
是int
int
是Pre-declared
type T map[int]string
的Underlying Type
是map[int]string
map[int]string
是Type Literal
- 比如
- 否则
T
的Underlying Type
是T
定义时引用的类型的Underlying Type
- 如果
Underlying Type 相同 #
如果两个 type 的 Underlying Type 相同,则它们可以有以下特性:
-
如果两个 type 都是 named type ,彼此之间不能相互赋值
type NewString string var my string ="a" // cannot use my (type string) as type NewString in assignment // 虽然它们的 Underlying Type 都是 string,但 string 类型的 my 不能赋值给 NewString 类型的 you var you NewString = my
-
如果两个 type 其中一个是 Unnamed Type,彼此之间可以相互赋值
package main type Ptr *int //named type type Map map[int]string type MapMap Map func main() { var p *int var mm Map var mmm MapMap // m1 m2 是 Unnamed Type var m1 map[int]string = mm var m2 map[int]string = mmm var ptr Ptr = p print(ptr) print(m1) print(m2) }
原因: 如果为一个类型起了名字,说明你想要做区分,所以两个 named types 即使 Underlying Type 相同也是不能相互赋值的。
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。