Golang 之(zhī)區分類型别名與類型定義
發表時(shí)間:2019-7-6
發布人(rén):融晨科技
浏覽次數:68
Golang 之(zhī)區分類型别名(Type Alias)與類型定義(Type define)
- 一、類型别名(Type Alias)、類型定義是(shì)什麽?
- 二、區分類型别名與類型定義
- 類型定義
- 類型别名
- 類型定義
- 區分類型别名、類型定義
- 非本地(dì / de)類型不(bù)能定義方法
一、類型别名(Type Alias)、類型定義是(shì)什麽?
類型别名 是(shì) Go 1.9 版本添加的(de)新功能。主要(yào / yāo)應用于(yú)代碼升級、工程重構、遷移中類型的(de)兼容性問題。C/C++ 語言中,代碼的(de)重構升級可以(yǐ)使用宏快速定義新的(de)代碼。Go 語言中并未選擇通過宏,而(ér)是(shì)選擇通過類型别名解決重構中最複雜的(de)類型名變更問題。
-
在(zài) Go 1.9 版本之(zhī)前内建類型定義的(de)代碼如下:
-
type byte uint8 type rune int32
在(zài)Go 1.9 版本之(zhī)後内建類型定義的(de)代碼如下:
-
通過以(yǐ)上(shàng)可以(yǐ)看出(chū)這(zhè)個(gè)修改就(jiù)是(shì)配合類型别名進行修改的(de)。type byte = uint8 type rune = int32
二、區分類型别名與類型定義
-
類型别名規定:Type Alias隻是(shì)Type 的(de)别名,本質上(shàng)Type Alias 與Type是(shì)同一個(gè)類型,即基本數據類型是(shì)一緻的(de)。好比如我們小時(shí)家裏人(rén)給我們起的(de)小名,上(shàng)學後英語老師給起的(de)英文名字,但是(shì)這(zhè)個(gè)名字都是(shì)指的(de)我們自己。
- 表面上(shàng)看類型别名與類型定義隻有一個(gè)等号的(de)差異("="),實際上(shàng)的(de)差異我們通過一段簡短的(de)代碼更爲(wéi / wèi)深刻的(de)理解二者之(zhī)間的(de)差異,如下代碼所示;
package main
import "fmt"
// 自定義類型myInt,基本類型是(shì)int
type myInt int
//将 int 類型取一個(gè)别名intAlias
type intAlias = int
func main() {
//聲明 a變量爲(wéi / wèi)自定義 myInt 類型
var a myInt
// 輸出(chū) a 的(de)類型 和(hé / huò)默認值
fmt.Printf("a Type: %T, value: %d\n", a, a)
//聲明 b變量爲(wéi / wèi) intAlias 類型
var b intAlias
// 輸出(chū) b 的(de)類型 和(hé / huò)默認值
fmt.Printf("b Type: %T, value: %d\n", b, b)
}
== 輸出(chū)結果 ==:
a Type: main.myInt, value: 0
b Type: int, value: 0
- 從上(shàng)面的(de)結果我們可以(yǐ)看出(chū),a 的(de)類型是(shì) main.myInt,表示main 包下定義的(de)myInt 類型。生成了(le/liǎo)新的(de)數據類型。
- b 的(de)類型是(shì) int 。intAlias 類型隻會在(zài)代碼中存在(zài),編譯完成時(shí),不(bù)會有 intAlias 類型。
類型定義
類型定義:依據基本類型聲明一個(gè)新的(de)數據類型。
// 新聲明一個(gè)變量c intAlias 類型
var c intAlias
c = a
fmt.Printf("c Type: %T, value: %d\n", c, c)
OutPut Result:
cannot use a (type myInt) as type int in assignment
從以(yǐ)上(shàng)可以(yǐ)看出(chū),變量 a 和(hé / huò) c 不(bù)是(shì)同一個(gè)類型,因此不(bù)能直接賦值;可以(yǐ)通過強制類型轉換,實現 修改爲(wéi / wèi) c=int(a)。