這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1.7 指標
支援指標類型 *T,指標的指標 **T,以及包含包名首碼的 *.T。
- 預設值
nil,沒有 NULL 常量。
- 操作符 "&" 取變數地址,"*" 透過指標訪問目標對象。
- 不支援指標運算,不支援 "->" 運算子,直接用 "." 訪問目標成員。
不能對指標做加減法等運算。
x := 1234p := &xp++ // Error: invalid operation: p += 1 (mismatched types *int and int)
可以在 unsafe.Pointer 和任意類型指標間進行轉換。
返回局部變數指標是安全的,編譯器會根據需要將其分配在 GC Heap 上。
func test() *int { x := 100 return &x // 在堆上分配 x 記憶體。但在內聯時,也可能直接分配在目標棧。}
將 Pointer 轉換成 uintptr,可變相實現指標運算。
注意:GC 把 uintptr 當成普通整數對象,它無法阻止 "關聯" 對象被回收。
1.8 自訂類型
可將類型分為命名和未命名兩大類。命名類型包括 bool、int、string 等,而 array、slice、map 等和具體元素類型、長度等有關,屬於未命名類型。
具有相同聲明的未命名類型被視為同一類型。
- 具有相同基底類型的指標。
- 具有相同元素類型和長度的
array。
- 具有相同元素類型的
slice。
- 具有相同索引值類型的
map。
- 具有相同元素類型和傳送方向的
channel。
- 具有相同欄位序列 (欄位名、類型、標籤、順序) 的匿名
struct。
- 簽名相同 (參數和傳回值,不包括參數名稱) 的
function。
- 方法集相同 (方法名、方法簽名相同,和次序無關) 的
interface。
例如,
var a struct { x int \`a\` }var b struct { x int \`ab\` }// cannot use a (type struct { x int "a" }) as type struct { x int "ab" } in assignmentb = a
可用 type 在全域或函數內定義新類型。
func main() { type bigint int64 var x bigint = 100 println(x)}
新類型不是原類型的別名,除擁有相同資料存放區結構外,它們之間沒有任何關係,不會持有原類型任何資訊。除非目標類型是未命名類型,否則必須顯式轉換。
x := 1234var b bigint = bigint(x) // 必須顯式轉換,除非是常量。var b2 int64 = int64(b)var s myslice = []int{1, 2, 3} // 未命名類型,隱式轉換。var s2 []int = s
下一篇: Go 邊看邊練 -《Go 學習筆記》系列(四)
- 本系列是基於雨痕的《Go 學習筆記》(第四版)整理彙編而成,非常感謝雨痕的辛勤付出與分享!
- 轉載請註明:文章轉載自:駭客與畫家的社區 [http://symphony.b3log.org]
- 如果你覺得本章節做得不錯,請在下面打賞一下吧~