• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go命令类型和未命名类型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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
  • T1和T2的底层类型都是string
  • T3和T4的底层类型都是[]string
  • T5和T6的底层类型都是[]T1

> 特别注意:T6、T5与T3、T4的底层类型是不一样的,一个是[]T1,另一个是[]string

 

判断类型相同

Go是强类型的语言,编译器在编译时会进行严格的类型检验。两个命名类型是否相同,参考如下:

1. 两个命令类型相同的条件是两个类型声明的语句完全相同

2. 命令类型和未命令类型永远不同

3. 两个未命令类型相同的条件是它们的类型声明字面量的结构相同,并且内部元素的类型相同

4. 通过类型别名语句声明的两个类型相同

 

类型别名语法 type T1 = T2,T1的类型完全和T2一样。引入别名主要有如下原因:

1. 为了解决新旧报的迁移兼容问题 ,比如context包先前并不在标准里面 ,后面迁移到了标准库

2. Go的按包进行隔离的机制不太精细,有时我们需要将大包划分为几个小包进行开发,但需要在大包里面暴露全部的类型给使用者

3. 解决新旧类型的迁移问题,新类型和旧类型的别名,后续的软件都基于新类型变成,在合适的时间将新类型升级为旧类型不兼容,常用于软件的柔性升级

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言并发编程总结发布时间:2022-07-10
下一篇:
给 Go 库作者的建议发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap