什麼是類型別名?什麼是潛在型別?
阿新 • • 發佈:2018-12-05
別名型別
在Go語言裡,可以用type
宣告自定義的各種型別。在這些自定義的型別中,有一種被叫做別名型別
。
舉個例子:
type MyString = string
這句程式碼的意思是:MyString是string型別的別名型別。顧名思義,別名型別和源型別的區別僅僅在名稱不同。
別名型別主要是為了重構程式碼
而存在的。
Go語言內建的基本型別中就存在2個別名型別。byte是uint8的別名型別。rune是int32的別名型別。
潛在型別
如果這樣宣告型別MyString
type MyString string //注意這裡沒有 = 符號
這時候,MyString和string就是2個不同的型別了。這裡的MyString是一個新的型別,不同於其他任何型別。這種方式叫做對型別的自定義
潛在型別相同的不同型別的值之間是可以進行型別轉換的。
別名型別在程式碼重構過程中的作用
- 名字可以取的更通俗易懂;
- 需要修改資料型別時,只用改定義的那一處地方;
- 可以很方便的新增特有方法,以實現某些介面。
對於大型的程式碼庫來說,能夠重構其整體結構是非常重要的,包括修改某些 API 所屬的包。大型重構應該支援一個過渡期:從舊位置和新位置獲得的 API 都應該是可用的,而且可以混合使用這些 API 的引用。Go 已經為常量、函式或變數的重構提供了可行的機制,但是並不支援型別。類型別名提供了一種機制,它可以使得 oldpkg.OldType 和 newpkg.NewType 是相同的,並且引用舊名稱的程式碼與引用新名稱的程式碼可以互相操作。
考慮將一個型別從一個包移動到另一個包中的情況,比如從 oldpkg.OldType 到 newpkg.NewType。可以在包 oldpkg 中指定一個新型別的別名 type OldType = newpkg.NewType,這樣以前的程式碼都無需修改。
以上,整理自《極客時間Go語言專欄》