1. 程式人生 > >什麼是類型別名?什麼是潛在型別?

什麼是類型別名?什麼是潛在型別?

別名型別

在Go語言裡,可以用type宣告自定義的各種型別。在這些自定義的型別中,有一種被叫做別名型別

舉個例子:

type MyString = string

這句程式碼的意思是:MyString是string型別的別名型別。顧名思義,別名型別和源型別的區別僅僅在名稱不同。

別名型別主要是為了重構程式碼而存在的。

Go語言內建的基本型別中就存在2個別名型別。byte是uint8的別名型別。rune是int32的別名型別。

潛在型別

如果這樣宣告型別MyString

type MyString string //注意這裡沒有 = 符號

這時候,MyString和string就是2個不同的型別了。這裡的MyString是一個新的型別,不同於其他任何型別。這種方式叫做對型別的自定義

。string可以被稱為MyString的潛在型別。潛在型別的含義是:某個型別在本質上是哪個型別或者哪個型別的集合。

潛在型別相同的不同型別的值之間是可以進行型別轉換的。

別名型別在程式碼重構過程中的作用

  1. 名字可以取的更通俗易懂;
  2. 需要修改資料型別時,只用改定義的那一處地方;
  3. 可以很方便的新增特有方法,以實現某些介面。

對於大型的程式碼庫來說,能夠重構其整體結構是非常重要的,包括修改某些 API 所屬的包。大型重構應該支援一個過渡期:從舊位置和新位置獲得的 API 都應該是可用的,而且可以混合使用這些 API 的引用。Go 已經為常量、函式或變數的重構提供了可行的機制,但是並不支援型別。類型別名提供了一種機制,它可以使得 oldpkg.OldType 和 newpkg.NewType 是相同的,並且引用舊名稱的程式碼與引用新名稱的程式碼可以互相操作。

考慮將一個型別從一個包移動到另一個包中的情況,比如從 oldpkg.OldType 到 newpkg.NewType。可以在包 oldpkg 中指定一個新型別的別名 type OldType = newpkg.NewType,這樣以前的程式碼都無需修改。

以上,整理自《極客時間Go語言專欄》