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. 改善深层神经网络-week3编程题(Tensorflow 实现手势识别 )

    TensorFlow Tutorial Initialize variables Start your own session Train algorithms Implement a Neural ...

  2. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  3. redis中lua脚本的简单使用

    一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...

  4. Canal的简单使用

    Canal的简单实用 一.背景 二.canal的工作原理 三.安装canal 1.mysql配置相关 1.检测binlog是否开启 2.mysql开启binlog 3.创建canal用户 2.cana ...

  5. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...

  6. SQL注入之猫舍之sqlmap的使用

    先说一下最常用的基础指令 -u 指定注入点(一般为url栏的网址) --dbs 跑库名 --tables 跑表名 --columns 跑字段名 --dump 枚举数据(高危指令,容易进去) -D 库名 ...

  7. Go语言核心36讲(Go语言进阶技术十六)--学习笔记

    22 | panic函数.recover函数以及defer语句(下) 我在前一篇文章提到过这样一个说法,panic 之中可以包含一个值,用于简要解释引发此 panic 的原因. 如果一个 panic ...

  8. [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly? For recursive components, make sure to provide the "name" option. found in ---> <Evaluate> at src/views/index/

    关于vue报错: [Vue warn]: Unknown custom element: <sapn> - did you register the component correctly ...

  9. 无法复现的“慢”SQL《死磕MySQL系列 八》

    系列文章 四.S 锁与 X 锁的爱恨情仇<死磕MySQL系列 四> 五.如何选择普通索引和唯一索引<死磕MySQL系列 五> 六.五分钟,让你明白MySQL是怎么选择索引< ...

  10. sql关联修改

    UPDATE  p  set p.ClientID = c.id  from PaymentTable p left JOIN ClientTable c on p.ClientID = c.Clie ...