這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。一個典型的類型系統包括:
- 基礎類型: byte, int, bool, float等
- 複合類型:數組,結構體,指標
- 可以指向任意對象的類型(Any類型)
- 值語義和引用語義
- 物件導向,即所有具備物件導向特徵的類型
- 介面
在GO語言中可以為任意類型(包括內建類型)添加相應的方法
上面的例子中我們定義了一個新類型 Integer ,Integer和int沒有本質區別,只是為內建的int增加了一個方法Less(),可以讓整型像一個普通的類一樣使用了。
在GO語言中沒有隱藏的this指標 1) 方法施加的目標顯示傳遞,沒有被隱藏起來 2) 方法施加的目標不需要非得是指標,也不用非得叫this
GO語言和C語言一樣,類型都是基於值傳遞的,要想改變變數的值,只能在函數中傳遞指標。
1. 類型系統
1.1. 值語義和引用語義 值語義和引用語義的差別在於賦值 b = a b.Modify()
如果b的修改不會影響a的值,那麼此類型屬於實值型別。如果會影響a的值,那麼此類型是參考型別。
GO語言中的大多數類型都屬於值語義,包括: 基本類型: byte, int, bool, float32, float64和string等 複合類型: array, struct, pointer等
GO語言中的類型的值語義表現的非常徹底。
1.2. 結構體 GO語言放棄了包括繼承在內的大量物件導向特性,只保留了組合這個最基礎的特性。
組合不能算物件導向的特性,因為在C語言這樣的過程式程式設計語言中,也有結構體,也有組合。組合只是形式複合類型的基礎。
GO語言中結構體的使用方式與C語言並沒有什麼明顯的不同。
2. 初始化 在GO語言中,未進行顯式初始化的變數都會被初始化為該類型的零值,例如bool類型的零值為false, int類型的零值為0, string類型的零值為空白字串。
結構體有多種初始方法,如下:
3. 匿名組合 確切的說,GO語言也提供了繼承,但是採用了組合的文法,所以我們將其稱為匿名組合
4. 可見度 GO語言對關鍵字的增加非常吝嗇,沒有private, protected, public這樣的關鍵字。要使某個符號對其他包可見,需要將該符號定義為以大寫字母開頭。
5. 介面 GO語言的介面並不是其他語言中所提供的介面概念。JAVA現在的介面是侵入式介面, GO的介面時非侵入式的。
在GO語言中,一個類只要實現了介面要求的所有函數,我們就說這個類實現了該介面。
在GO語言中,介面賦值在GO語言中分為如下兩種情況: 1. 將對象執行個體賦值給介面 2. 將一個介面賦值給另一個介面