在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Go 命令类型和未命名类型例子package main import "fmt" // 使用type声明的是命令类型 // type new_type old_type type Person struct { name string age int } func main() { // 使用struct字面量声明的是未命令类型 a := struct { name string age int }{"test", 18} fmt.Println("%T\n", a) fmt.Println("%v\n", a) b := "测试string" fmt.Println("%T\n", b) fmt.Println("%v\n", b) c := Person{"tom", 12} fmt.Println("%T\n", c) fmt.Println("%v\n", c) } 底层类型上面已经说明了所有类型:命令类型和未命令类型、预声明类型、类型字面量、自定义类型的关系。 所有“类型”都有一个underlying type(底层类型)。底层类型的规则如下: 1. 预声明类型(Per-declared types)和类型字面量(type literals)的底层类型是它们自身。 2. 自定义类型type new_type old_type中的new_type的底层类型是逐层递归向下查找的,直到查到的old_type是预声明类型或字面类型为止。 type T1 string type T2 T1 type T3[] string type T4 T3 type T5 []T1 type T6 T5
> 特别注意:T6、T5与T3、T4的底层类型是不一样的,一个是[]T1,另一个是[]string
判断类型相同Go是强类型的语言,编译器在编译时会进行严格的类型检验。两个命名类型是否相同,参考如下: 1. 两个命令类型相同的条件是两个类型声明的语句完全相同 2. 命令类型和未命令类型永远不同 3. 两个未命令类型相同的条件是它们的类型声明字面量的结构相同,并且内部元素的类型相同 4. 通过类型别名语句声明的两个类型相同
类型别名语法 type T1 = T2,T1的类型完全和T2一样。引入别名主要有如下原因:1. 为了解决新旧报的迁移兼容问题 ,比如context包先前并不在标准里面 ,后面迁移到了标准库 2. Go的按包进行隔离的机制不太精细,有时我们需要将大包划分为几个小包进行开发,但需要在大包里面暴露全部的类型给使用者 3. 解决新旧类型的迁移问题,新类型和旧类型的别名,后续的软件都基于新类型变成,在合适的时间将新类型升级为旧类型不兼容,常用于软件的柔性升级
|
请发表评论