go version go1.11 windows/amd64

本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语言的 类型声明(Type declarations)。

类型声明 即 绑定一个标识符(新类型名称) 到 一个类型。

有两种形式:类型别名声明(alias declarations)、新类型定义(type definitions)。

类型别名声明

很简单:在类型别名和类型之间使用等号(=)。官文示例:

  1. type (
  2. nodeList = []*Node // nodeList and []*Node are identical types
  3. Polar = polar // Polar and polar denote identical types
  4. )

注意,类型别名 也是一个标识符,也是有其 作用域(scope)的。

新类型定义

这个复杂一些,还好,自己理解了90%了。

创建一个新的类型,这个类型 和 给定的已存在的(旧)类型 有相同的底层类型和操作,并用一个新的 标识符 来表示这个新类型。

这样的 新类型 也叫做 自定义类型(defined type)——解决了昨天的困惑,新类型和其它类型是不同的,即便是用来创造它的旧类型。

官文示例:

新旧类型之间 没有等号(=),空格分隔;

通过示例,知道了之前使用的 type+struct/interface原来是在创建新的类型;

  1. type (
  2. Point struct{ x, y float64 } // Point and struct{ x, y float64 } are different types
  3. polar Point // polar and Point denote different types
  4. )
  5.  
  6. type TreeNode struct {
  7. left, right *TreeNode
  8. value *Comparable
  9. }
  10.  
  11. type Block interface {
  12. BlockSize() int
  13. Encrypt(src, dst []byte)
  14. Decrypt(src, dst []byte)
  15. }

进阶1:

新类型 可以拥有自己的方法,但是,新类型 不会继承 任何旧类型的方法, 就是说,想要拥有方法,需要自行定义。

但是(但是来了),接口类型、复合类型(a composite type)的元素 的方法保持不变。

官文示例(用到了上面示例中的Block类型):

  1. // A Mutex is a data type with two methods, Lock and Unlock.
  2. type Mutex struct { /* Mutex fields */ }
  3. func (m *Mutex) Lock() { /* Lock implementation */ }
  4. func (m *Mutex) Unlock() { /* Unlock implementation */ }
  5. // 类型Mutex有两方法:Lock,Unlock
  6. // NewMutex has the same composition as Mutex but its method set is empty.
  7. type NewMutex Mutex
  8. // 新类型NewMutex的方法集是空的
  9. // The method set of PtrMutex's underlying type *Mutex remains unchanged,
  10. // but the method set of PtrMutex is empty.
  11. type PtrMutex *Mutex
  12. // 新类型PtrMutex的方法集也是空的,,这个指针看来不是复合类型啊,,
  13. // The method set of *PrintableMutex contains the methods
  14. // Lock and Unlock bound to its embedded field Mutex.
  15. type PrintableMutex struct {
  16. Mutex
  17. }
    // 疑问:为何是*PrintableMutex?这个就是复合类型吗?到底什么是复合类型?有哪些?
  18.  
  19. // MyBlock is an interface type that has the same method set as Block.
  20. type MyBlock Block
    // 这里的Block是 指针类型的,前一个官文示例中定义了

进阶2:

新类型定义可以用于定义不同的 布尔类型、数字类型、字符串类型,然后给新类型添加方法。

下面是官文示例:

  1. type TimeZone int
  2.  
  3. const (
  4. EST TimeZone = -(5 + iota)
  5. CST
  6. MST
  7. PST
  8. )
  9.  
  10. func (tz TimeZone) String() string {
  11. return fmt.Sprintf("GMT%+dh", tz)
  12. }

测试代码:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type TimeZone int
  8.  
  9. const (
  10. EST TimeZone = -(5 + iota)
  11. CST
  12. MST
  13. PST
  14. )
  15.  
  16. func (tz TimeZone) String() string {
  17. return fmt.Sprintf("GMT%+dh", tz)
  18. }
  19.  
  20. func main() {
  21. var x TimeZone = 1
  22. fmt.Println(x.String())
  23. x = 123
  24. fmt.Println(x.String())
  25. x = -999123
  26. fmt.Println(x.String())
  27.  
  28. fmt.Println(EST, CST, MST, PST)
  29. }

测试 type TimeZone int

测试结果:

  1. GMT+1h
  2. GMT+123h
  3. GMT-999123h
  4. GMT-5h GMT-6h GMT-7h GMT-8h

上面的示例有两个知识点自己还需要去dig:const声明、iota的使用。

给 新类型 TimeZone 添加了方法String(),结果,使用fmt.Sprintf()打印这几个常量时就出现了其方法String()返回的字符串了。

这个String()方法一定有特别的用途的!

对了,还有 复合类型!这也是个重难点!在官文中找到了说明:Expression -> Composite literals

对了,还有 底层类型!昨天的官文是这么介绍的:

Each type T has an underlying type:

If T is one of the predeclared boolean, numeric, or string types, or a type literal, the corresponding underlying type is T itself.

Otherwise, T's underlying type is the underlying type of the type to which T refers in its type declaration.

翻译:

如果 类型T 是预定义的 布尔、数字、字符串 类型,或者 类型字面量(不理解?),那么,其相应的底层类型是 T 本身。

否则,类型T 的底层类型是 类型T在它的类型声明中 应用的 类型的底层类型。

好,感觉看懂这第二句话了!“在它的类型声明中”,不就是本文前面讲的 类型别名 和 新类型定义 吗?

怎么找到一个类型的底层类型呢?请参考下面的链接(在昨天有使用过):

golang如何获取变量的类型:反射,类型断言

好勒,就这么多!感觉自己又进步了!稍后学习下上面的 Expression -> Composite literals

Go语言规格说明书 之 类型声明(Type declarations)的更多相关文章

  1. Go语言规格说明书 之 类型(Types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  2. Go语言规格说明书 之 变量声明(Variable/Short variable declarations)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  3. drools的类型声明(Type declarations)

    一.背景 在我们编写drl规则的时候,有些时候需要自己声明一些类,用于辅助之后的规则运行,如果需要用到的类还需要在java中预先声明出来,这样就不灵活了,那么是否可以在drl文件中声明一个类呢?可以使 ...

  4. Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  5. Go语言规格说明书 之 通道类型(Channel types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  6. Go语言规格说明书 之 接口类型(Interface types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的  ...

  7. Go语言规格说明书 之 结构体类型(Struct types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  8. Go语言规格说明书 之 内建函数(Built-in functions)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  9. Go语言规格说明书 之 词汇元素(Lexical elements)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

随机推荐

  1. 【LOJ#6283】数列分块7

    题目大意:维护一个 N 个数组成的序列,支持区间加.区间乘.单点询问. 题解:在每一个块中维护两个标记,即:整块加和的标记和整块乘积的标记.不过由于有两个标记,涉及到计算区间总和的顺序问题. 一个指定 ...

  2. 拖拽功能by javascript 和 react 两种实现方法

    使用鼠标移动图片或者移动图像怪有意思的,那这个移动的效果是怎么实现的呢? 在拖动的过程中,我们会涉及到鼠标向下按,以及移动图形,还有我们松开这几个步骤. 当我们将鼠标向下按的时候,我们鼠标点的这个动作 ...

  3. 原生js操作option

    <script type="text/javascript"> // 1.动态创建select function createSelect() { var mySele ...

  4. EOJ2018.10 月赛(B 数学+思维题)

    传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 找到最小的包含子序列a的序列s,并且序列s是 p -莫干山序 ...

  5. echarts图表点击事件之跳转页面和加载页面

    下图显示四个条形图,点击条形图就跳转到其页面,这说明您要判断你点了那个条形图. echarts给了它点击事件 写法,我们只要模仿就行,代码如下: //echarts图表点击跳转 myChart.on( ...

  6. Docker:搭建RabbitMQ集群

    RabbitMQ原理介绍(一) RabbitMQ安装使用(二) RabbitMQ添加新用户并支持远程访问(三) RabbitMQ管理命令rabbitmqctl详解(四) RabbitMQ两种集群模式配 ...

  7. Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)

    1.TCP握手定理 2.TCP状态 l  CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”. l  LISTEN :表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接. ...

  8. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  9. js event 冒泡和捕获事件详细介绍【转】

    冒泡和捕获 冒泡: 事件从内向外,从下向上执行 (默认行为) 捕获: 事件从外向内,从上向下执行 vue之capture 捕获事件 capture.html <!DOCTYPE html> ...

  10. elasticsearch核心知识梳理

    https://blog.csdn.net/laoyang360/article/details/52244917