久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Go語言類型別名是什么

      在Go語言中,類型別名就是為已存在的“類型”定義一個(gè)別名,可以使用type關(guān)鍵字來定義,語法“type TypeAlias = Type”。類型別名是Go 1.9版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題;在 C/C++ 語言中,代碼重構(gòu)升級可以使用宏快速定義一段新的代碼,Go語言中沒有選擇加入宏,而是解決了重構(gòu)中最麻煩的類型名變更問題。

      Go語言類型別名是什么

      本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

      Go語言 類型別名是什么

      Golang 中類型別名就是為已存在的 類型 定義一個(gè)別名。Golang 中類型別名使用 type 關(guān)鍵字來定義。

      語法

      type TypeAlias = Type
      登錄后復(fù)制

      登錄后復(fù)制

      參數(shù)

      參數(shù) 描述
      type 定義類型別名使用的關(guān)鍵字。
      TypeAlias Type 的別名。
      Type 需要起別名的類型。

      類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題。在 C/C++ 語言中,代碼重構(gòu)升級可以使用宏快速定義一段新的代碼,Go語言中沒有選擇加入宏,而是解決了重構(gòu)中最麻煩的類型名變更問題。

      在 Go 1.9 版本之前定義內(nèi)建類型的代碼是這樣寫的:

      type byte uint8 type rune int32
      登錄后復(fù)制

      而在 Go 1.9 版本之后變?yōu)椋?/p>

      type byte = uint8 type rune = int32
      登錄后復(fù)制

      這個(gè)修改就是配合類型別名而進(jìn)行的修改。

      區(qū)分類型別名與類型定義

      定義類型別名的寫法為:

      type TypeAlias = Type
      登錄后復(fù)制

      登錄后復(fù)制

      類型別名規(guī)定:TypeAlias 只是 Type 的別名,本質(zhì)上 TypeAlias 與 Type 是同一個(gè)類型,就像一個(gè)孩子小時(shí)候有小名、乳名,上學(xué)后用學(xué)名,英語老師又會(huì)給他起英文名,但這些名字都指的是他本人。

      類型別名與類型定義表面上看只有一個(gè)等號的差異,那么它們之間實(shí)際的區(qū)別有哪些呢?下面通過一段代碼來理解。

      package main import (     "fmt" ) // 將NewInt定義為int類型 type NewInt int // 將int取一個(gè)別名叫IntAlias type IntAlias = int func main() {     // 將a聲明為NewInt類型     var a NewInt     // 查看a的類型名     fmt.Printf("a type: %Tn", a)     // 將a2聲明為IntAlias類型     var a2 IntAlias     // 查看a2的類型名     fmt.Printf("a2 type: %Tn", a2) }
      登錄后復(fù)制

      代碼運(yùn)行結(jié)果:

      a type: main.NewInt a2 type: int
      登錄后復(fù)制

      代碼說明如下:

      • 第 8 行,將 NewInt 定義為 int 類型,這是常見的定義類型的方法,通過 type 關(guān)鍵字的定義,NewInt 會(huì)形成一種新的類型,NewInt 本身依然具備 int 類型的特性。

      • 第 11 行,將 IntAlias 設(shè)置為 int 的一個(gè)別名,使用 IntAlias 與 int 等效。

      • 第 16 行,將 a 聲明為 NewInt 類型,此時(shí)若打印,則 a 的值為 0。

      • 第 18 行,使用%T格式化參數(shù),打印變量 a 本身的類型。

      • 第 21 行,將 a2 聲明為 IntAlias 類型,此時(shí)打印 a2 的值為 0。

      • 第 23 行,打印 a2 變量的類型。

      結(jié)果顯示 a 的類型是 main.NewInt,表示 main 包下定義的 NewInt 類型,a2 類型是 int,IntAlias 類型只會(huì)在代碼中存在,編譯完成時(shí),不會(huì)有 IntAlias 類型。

      非本地類型不能定義方法

      能夠隨意地為各種類型起名字,是否意味著可以在自己包里為這些類型任意添加方法呢?參見下面的代碼演示:

      package main import (     "time" ) // 定義time.Duration的別名為MyDuration type MyDuration = time.Duration // 為MyDuration添加一個(gè)函數(shù) func (m MyDuration) EasySet(a string) { } func main() { }
      登錄后復(fù)制

      代碼說明如下:

      • 第 8 行,為 time.Duration 設(shè)定一個(gè)類型別名叫 MyDuration。

      • 第 11 行,為這個(gè)別名添加一個(gè)方法。

      編譯上面代碼報(bào)錯(cuò),信息如下:

      cannot define new methods on non-local type time.Duration
      登錄后復(fù)制

      編譯器提示:不能在一個(gè)非本地的類型 time.Duration 上定義新方法,非本地類型指的就是 time.Duration 不是在 main 包中定義的,而是在 time 包中定義的,與 main 包不在同一個(gè)包中,因此不能為不在一個(gè)包中的類型定義方法。

      解決這個(gè)問題有下面兩種方法:

      • 將第 8 行修改為 type MyDuration time.Duration,也就是將 MyDuration 從別名改為類型;

      • 將 MyDuration 的別名定義放在 time 包中。

      在結(jié)構(gòu)體成員嵌入時(shí)使用別名

      當(dāng)類型別名作為結(jié)構(gòu)體嵌入的成員時(shí)會(huì)發(fā)生什么情況呢?請參考下面的代碼。

      package main import (     "fmt"     "reflect" ) // 定義商標(biāo)結(jié)構(gòu) type Brand struct { } // 為商標(biāo)結(jié)構(gòu)添加Show()方法 func (t Brand) Show() { } // 為Brand定義一個(gè)別名FakeBrand type FakeBrand = Brand // 定義車輛結(jié)構(gòu) type Vehicle struct {     // 嵌入兩個(gè)結(jié)構(gòu)     FakeBrand     Brand } func main() {     // 聲明變量a為車輛類型     var a Vehicle         // 指定調(diào)用FakeBrand的Show     a.FakeBrand.Show()     // 取a的類型反射對象     ta := reflect.TypeOf(a)     // 遍歷a的所有成員     for i := 0; i < ta.NumField(); i++ {         // a的成員信息         f := ta.Field(i)         // 打印成員的字段名和類型         fmt.Printf("FieldName: %v, FieldType: %vn", f.Name, f.Type.             Name())     } }
      登錄后復(fù)制

      代碼輸出如下:

      FieldName: FakeBrand, FieldType: Brand FieldName: Brand, FieldType: Brand
      登錄后復(fù)制

      代碼說明如下:

      • 第 9 行,定義商標(biāo)結(jié)構(gòu)。

      • 第 13 行,為商標(biāo)結(jié)構(gòu)添加 Show() 方法。

      • 第 17 行,為 Brand 定義一個(gè)別名 FakeBrand。

      • 第 20~25 行,定義車輛結(jié)構(gòu) Vehicle,嵌入 FakeBrand 和 Brand 結(jié)構(gòu)。

      • 第 30 行,將 Vechicle 實(shí)例化為 a。

      • 第 33 行,顯式調(diào)用 Vehicle 中 FakeBrand 的 Show() 方法。

      • 第 36 行,使用反射取變量 a 的反射類型對象,以查看其成員類型。

      • 第 39~42 行,遍歷 a 的結(jié)構(gòu)體成員。

      • 第 45 行,打印 Vehicle 類型所有成員的信息。

      這個(gè)例子中,F(xiàn)akeBrand 是 Brand 的一個(gè)別名,在 Vehicle 中嵌入 FakeBrand 和 Brand 并不意味著嵌入兩個(gè) Brand,F(xiàn)akeBrand 的類型會(huì)以名字的方式保留在 Vehicle 的成員中。

      如果嘗試將第 33 行改為:

      a.Show()
      登錄后復(fù)制

      編譯器將發(fā)生報(bào)錯(cuò):

      ambiguous selector a.Show
      登錄后復(fù)制

      在調(diào)用 Show() 方法時(shí),因?yàn)閮蓚€(gè)類型都有 Show() 方法,會(huì)發(fā)生歧義,證明 FakeBrand 的本質(zhì)確實(shí)是 Brand 類型。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號