go中的type

  1. type分三类golang

    1. 预声明标识类型,基本就是boolean,numeric and string
    2. 复合类型,如:map slice arry struct interface pointer function channel 这些使用(type字面量)构造的类型
    3. 自声明类型,分两种:c#

      var Age int // 类型定义
      var Int = int // 类型别名
      • 类型定义,type: 一人千面post

        • 建立了一个彻底新的类型,与其所基于的类型是两个不一样的类型。
        • 不继承底层类型的方法,但会继承底层类型的元素(若是是interface类型,那么其方法集也会保留下来,在我看interface的方法集实际上相似于字段)
      • 类型别名,类型别名是给某个类型起的别名,该别名本质上依然是该类型。
  2. 底层类型,每个type都有其底层类型,1和2类的底层类型都是其自己,3的底层类型视状况而定。指针

    type (
        A1 = string
        A2 = A1
    )
    
    type (
        B1 string
        B2 B1
        B3 []B1
        B4 B3
    )

    A1,A2,B1,B2的底层类型都是string,B3,B4的底层类型都是[]B1code

  3. 接口类型(interface type),推荐看Go接口深刻解析继承

    • 接口类型指定了一个方法集,这个方法集称之为该接口类型的接口(原话为:An interface type specifies a method set called its interface)
    • 该方法集的全部方法名必须是惟一且不为空的
    • 任何一个实现了该接口集的类型(即:该类型实现了全部该接口定义的方法集,能够多不能少)均可以做为该接口的变量来存储。即:该类型实现了该接口类型。
    • 未初始化的接口变量是nil
    • 某个类型能够实现多个接口类型
    • 全部类型都实现了空接口 interface {},空接口能够用来作泛型。
    • 内嵌接口:接口能够内嵌,包含接口包含了被包含接口所指定的方法集,但包含接口中不得再次定义已处于被包含接口指定的方法集中的方法
    type ReadWriter interface {
        Read(b Buffer) int
        Write(b Buffer) int
    }
    type File interface {
        ReadWriter
        Close()
    }
  4. 结构体类型,结构体是命名元素的序列,咱们称这些命名元素为字段,每一个字段都有名字(name)和类型(type)。非空字段的名字必须惟一,字段能够显式或者隐式(一个字段只有type而没有名字)的指定。接口

    • 隐式字段称为嵌入字段。嵌入字段要么是个类型,要么是个非接口类型的指针类型。
    typt T struct {
        name string
    }
    
    type T1 struct {
        value int // 正常字段
        int // 嵌入字段:int类型
        *T  // 嵌入字段:指向类型T的指针类型
    }
    • 若是一个 type T1 被嵌入另外一个 type T 做为它的 filed,T1 的全部 field 和 method 均可以在 T 中使用
    • 空结构体,重要的是其内存消耗等于0。

参考

  1. Go类型系统
  2. Go官方文档
相关文章
相关标签/搜索