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官方文檔
相關文章
相關標籤/搜索