Go 命令類型和未命名類型

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. 解決新舊類型的遷移問題,新類型和舊類型的別名,後續的軟件都基於新類型變成,在合適的時間將新類型升級爲舊類型不兼容,常用於軟件的柔性升級

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章