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

Go 命令类型和未命名类型的更多相关文章

  1. C语言之预处理命令与用typedef命名已有类型

    预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...

  2. Redis常用命令入门1:字符串类型命令

    Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...

  3. .NET错误:未找到类型或命名空间名称

    现象:编译项目时提示未找到类型或命名空间名称"... " 解决方法:如果是未找到类型,检查是否引用了类型所在的命名空间,使用using指令:如果是未找到命名空间,那么检查是否引用了 ...

  4. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  5. Redis常用命令入门4:集合类型

    集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...

  6. sqlServer 2008修改字段类型和重命名字段名称的sql语句

    sqlServer 2008修改字段类型和重命名字段名称的sql语句 //修改字段的类型 alter table fdi_news alter column c_author nvarchar(50) ...

  7. [C#错误] 未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)

    现象:编译项目时提示未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)解决方法:如果是未找到类型,检查是否引用了类型所在的命名空间,使用using指令.如 ...

  8. 错误 3 未找到类型“sdk:Label”。请确保不缺少程序集引用并且已生成所有引用的程序集。

    错误: 错误 3 未找到类型“sdk:Label”.请确保不缺少程序集引用并且已生成所有引用的程序集. 错误 1 命名空间“http://schemas.microsoft.com/winfx/200 ...

  9. Error-Javascript:错误:页面文档类型(DOCTYPE)未声明!

    ylbtech-Error-Javascript:错误:页面文档类型(DOCTYPE)未声明! 1.返回顶部 1. HTML1300: 进行了导航.文件: TransferNote.aspxHTML1 ...

随机推荐

  1. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. the Agiles Scrum Meeting 博客汇总

    the Agiles 团队博客目录 一.Scrum Meeting 1. Alpha the Agiles Scrum Meeting 1 the Agiles Scrum Meeting 2 the ...

  3. Noip模拟7 2021.6.11

    前言 考试时候der展了,T1kmp没特判(看来以后还是能hash就hash),T2搜索细节没注意,ans没清零,130飞到14.... T1 匹配(hash/kmp) 这太水了,其实用个hash随便 ...

  4. Linux C语言链表详细分析

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

  5. 矩形覆盖 牛客网 剑指Offer

    矩形覆盖 牛客网 剑指Offer 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: ...

  6. Django(73)django-debug-toolbar调试工具

    介绍 Django框架的调试工具栏使用django-debug-toolbar库,是一组可配置的面板,显示有关当前请求/响应的各种调试信息,点击时,显示有关面板内容的更多详细信息. 应用 1. 安装 ...

  7. 学习JS的第三天

    一.逻辑分支(续) 1.三目运算符:条件运算符 a>b?c:d;表达式1?表达式2:表达式3; 根据表达式1执行的结果,来决定执行表达式2还是表达式3 表达式1结果是true执行表达式2,最终返 ...

  8. mac 工作区

    https://www.zhihu.com/question/20917614 http://www.bjhee.com/mission-control.html 窗口切换 https://sspai ...

  9. 高德地图API中折线polyline不能跨越180度经度线的解决方案

    1.问题 最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数.但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示: 图中有三个 ...

  10. Part 20 Create custom service in AngularJS

    Whenever the case changes from lower to upper, a single space character should be inserted. This mea ...