欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go語言類型別名指的是什么

這篇文章主要介紹了Go語言類型別名指的是什么的相關知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言類型別名指的是什么文章都會有所收獲,下面我們一起來看看吧。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了萍鄉(xiāng)免費建站歡迎大家使用!

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

Go語言 類型別名是什么

Golang 中類型別名就是為已存在的 類型 定義一個別名。Golang 中類型別名使用 type 關鍵字來定義。

語法

type TypeAlias = Type

參數(shù)

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

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

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

type byte uint8
type rune int32

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

type byte = uint8
type rune = int32

這個修改就是配合類型別名而進行的修改。

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

定義類型別名的寫法為:

type TypeAlias = Type

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

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

package main
import (
    "fmt"
)
// 將NewInt定義為int類型
type NewInt int
// 將int取一個別名叫IntAlias
type IntAlias = int
func main() {
    // 將a聲明為NewInt類型
    var a NewInt
    // 查看a的類型名
    fmt.Printf("a type: %T\n", a)
    // 將a2聲明為IntAlias類型
    var a2 IntAlias
    // 查看a2的類型名
    fmt.Printf("a2 type: %T\n", a2)
}

代碼運行結果:

a type: main.NewInt
a2 type: int

代碼說明如下:

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

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

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

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

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

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

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

非本地類型不能定義方法

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

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

代碼說明如下:

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

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

編譯上面代碼報錯,信息如下:

cannot define new methods on non-local type time.Duration

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

解決這個問題有下面兩種方法:

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

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

在結構體成員嵌入時使用別名

package main
import (
    "fmt"
    "reflect"
)
// 定義商標結構
type Brand struct {
}
// 為商標結構添加Show()方法
func (t Brand) Show() {
}
// 為Brand定義一個別名FakeBrand
type FakeBrand = Brand
// 定義車輛結構
type Vehicle struct {
    // 嵌入兩個結構
    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: %v\n", f.Name, f.Type.
            Name())
    }
}

代碼輸出如下:

FieldName: FakeBrand, FieldType: Brand
FieldName: Brand, FieldType: Brand

代碼說明如下:

  • 第 9 行,定義商標結構。

  • 第 13 行,為商標結構添加 Show() 方法。

  • 第 17 行,為 Brand 定義一個別名 FakeBrand。

  • 第 20~25 行,定義車輛結構 Vehicle,嵌入 FakeBrand 和 Brand 結構。

  • 第 30 行,將 Vechicle 實例化為 a。

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

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

  • 第 39~42 行,遍歷 a 的結構體成員。

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

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

如果嘗試將第 33 行改為:

a.Show()

編譯器將發(fā)生報錯:

ambiguous selector a.Show

在調(diào)用 Show() 方法時,因為兩個類型都有 Show() 方法,會發(fā)生歧義,證明 FakeBrand 的本質(zhì)確實是 Brand 類型。

關于“Go語言類型別名指的是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言類型別名指的是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標題名稱:Go語言類型別名指的是什么
文章起源:http://chinadenli.net/article6/gpdhig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航域名注冊、電子商務、商城網(wǎng)站網(wǎng)站設計小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管
久久99青青精品免费| 日韩成人中文字幕在线一区| 99国产高清不卡视频| 91蜜臀精品一区二区三区| 五月激情婷婷丁香六月网| 欧美日韩无卡一区二区| 欧美国产日本高清在线| 精品国产亚洲av久一区二区三区 | 最近中文字幕高清中文字幕无| 亚洲欧美中文日韩综合| 国产av熟女一区二区三区蜜桃| 国产成人精品视频一二区| 国产精品一区欧美二区| 欧美日韩国产亚洲三级理论片| 亚洲欧美日本成人在线| 丰满人妻少妇精品一区二区三区| 亚洲精品av少妇在线观看| 东北女人的逼操的舒服吗| 亚洲中文字幕乱码亚洲| 精品老司机视频在线观看| 精品一区二区三区中文字幕| 婷婷色香五月综合激激情| 日本在线 一区 二区| 亚洲黄色在线观看免费高清| 欧美整片精品日韩综合| 国产亚洲欧美日韩国亚语| 日韩三极片在线免费播放| 中文精品人妻一区二区| 日本视频在线观看不卡| 视频一区二区 国产精品| 小黄片大全欧美一区二区| 欧美日韩国产综合特黄| 亚洲午夜福利视频在线| 熟女乱一区二区三区四区| 中文字幕有码视频熟女| 国产av熟女一区二区三区蜜桃| 男人把女人操得嗷嗷叫| 欧美精品日韩精品一区| 麻豆国产精品一区二区| 欧美日韩国产欧美日韩| 日本中文在线不卡视频|