91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Go中的類型別名

發布時間:2021-10-14 15:48:55 來源:億速云 閱讀:190 作者:iii 欄目:編程語言

這篇文章主要介紹“如何理解Go中的類型別名”,在日常操作中,相信很多人在如何理解Go中的類型別名問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Go中的類型別名”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

有下面 3 行代碼:

// 32 位機器 1)var x int32 = 32.0 2)var y int = x 3)var z rune = x

它們是否能編譯通過?為什么?

如果面試時問這道題,你需要想想面試官想考察你什么。在往下看之前,建議你記下自己的答案。

01 數字字面量

在 Go 語言中,字面量是無類型(untyped)的。無類型是什么意思?無類型意味著可以賦值給類似類型的變量或常量。用上面例子,32.0  是無類型的浮點數字面量,因此它可以賦值給任意數字相關類型變量(或常量)。以下都是合法的:

var a int64 = 32.0 var b int = 32.0 var c float32 = 32.0 var d complex64 = 32.0 var e byte = 32.0 var f rune = 32.0

所以上題中 1)是正確的。

02 不同類型

在目前 Go 1.16 版本中(實際上只有很早期的版本不是),int 類型在 32 位機器占 4 字節,64 位機器占 8 字節。所以,在 32  位機器上,int32 和 int 的內存占用和內存布局是完全一樣的。但 Go 語言不會做隱式類型轉換,int 和 int32 是不同的類型,因此上題中  2)編譯不通過。

03 類型別名

熟悉 C 語言的小伙伴,看到 Go 中以下定義:

type myint int

會以為 myint 和 int 是一樣的,認為 myint 是 int 的別名。而實際上,myint 是和 int 完全不一樣的類型,只不過 myint  的底層類型是 int,它們直接可以強制類型轉換,卻不會隱式轉換。關于這點無需多講,重點要講的是類型別名。

從 Go1.9 開始引入了類型別名,定義如下:

AliasDecl = identifier, "=", Type .

具體例子:

type intalias = int

myint 是新類型,和 int 不一樣;而 intalias 卻和 int 一樣,它只是 int 的別名:所有使用 intalias 的地方都可以使用  int。

那為什么 Go 中會引入類型別名呢?Russ Cox 的論文 Codebase Refactoring (with help from Go)  介紹了它的背景。總結一下類型別名的用途,主要有兩點:

  • 在大規模重構項目代碼的時候,尤其是將一個類型從一個包移動到另一個包中的時候,有些代碼會使用新包中的類型,有些代碼使用舊包中的類型, 最典型的是  context 包。最開始,context 包名是 golang.org/x/net/context,1.7 開始,引入標準庫,這樣一來,存在兩份。Go 1.9  開始采用別名重構了它;

  • 允許一個龐大的包分解成內部的幾個小包,但是小包中的類型需要集中暴漏在上層的大包中;

在 Go 中,你可以為任意類型定義別名,比如數組、結構體、指針、函數、接口、Slice、Map、Channel 等,包括為自定義類型定義別名。

type F = func() type I = interface{} ...

此外,還可以為其他包中的類型定義別名,比如為標準庫類型定義別名:

type MyReader = bufio.Reader

關于類型別名的一些注意事項:

  • 別名和原類型是一樣的,因此 switch-type 結構中,不能存在兩個 case,一個是原類型,一個是別名;

  • 類型別名不能循環定義,比如以下是不允許的:

type T = struct {  next *T1 }  type T1 = T
  • 因為別名和原類型是一樣的,因此共享同樣的方法集,不論這個方法是定義在原類型還是別名上;

  • 別名的導出性可以和原類型不一樣;

  • 不能為別的包的類型通過定義別名來增加方法。以下行為是不允許的:

type MyReader = bufio.Reader func (MyReader) AliasMethod() {  fmt.Println("This is alias method") }

編譯報錯:cannot define new methods on non-local type bufio.Reader。

回到開頭題目的 3),rune 是什么類型?定義如下:

type rune = int32

很顯然,rune 是 int32 的別名,因此題目中 3)也能編譯通過。

除了 rune,Go 內置類型中,還有 byte 是 uint8 的別名:

type byte = uint8

需要說明的是,在 Go1.9 之前,rune 和 byte 的別名性質就存在,是編譯器負責處理的。只是 Go1.9 之后,別名可以用于其他類型了。

到此,關于“如何理解Go中的類型別名”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI

武鸣县| 邵阳市| 黑水县| 娱乐| 韶山市| 漳浦县| 永清县| 象州县| 连江县| 库车县| 柳江县| 博湖县| 中牟县| 雷波县| 肥乡县| 淮南市| 齐河县| 涟源市| 自治县| 常山县| 永新县| 临邑县| 四子王旗| 兴化市| 繁昌县| 汶上县| 镇平县| 长春市| 肃宁县| 定日县| 平远县| 乐陵市| 天津市| 贵南县| 临泉县| 怀仁县| 新蔡县| 化德县| 新津县| 晋州市| 当阳市|