Go語言類型中的一些小細節【筆記】

把平時的一些筆記放上來,主要是一些比較小的問題,這裏是關於golang中的類型中須要記錄的小知識點。golang

常量

【1】能夠是某些編譯器能計算出結果的表達式數組

  1. unsafe.Sizeof
  2. len
  3. cap
const {
    ptrSize = unsafe.Sizeof(unintptr(0))
    strSize = len("Hello")
}

【2】當常量的不指定類型和值,默認和上一行的常量的類型和值相同安全

const {
    x uint6 = 120
    y
    s = "abc"
    z
}

枚舉

關鍵字:iota數據結構

const {
    a = iota    // 0 默認爲0
    b           // 1 默認遞增1
    c = 100     // 100 手動設置數據
    d           // 100
    e = iota    // 4    須要顯式調用iota,計算c、d的位置
    d           // 5
}

展開

  1. 變量和常量的區別:變量在運行時分配內存空間,常量一般會被編譯器在預處理階段直接展開,做爲指令數據直接使用。數字常量不分配地址空間;
  2. 常量陷阱:不指定類型的常量能夠給其餘常量賦值,顯式指定值的常量不能夠給其餘常量賦值。

引用類型

特指:slice、map、chaneel函數

new和make的區別
  1. new按指定類型分配內存空間
  2. make按照必定的規則(建立函數或指令)構建目標,完成相關內存分配和屬性初始化
自定義類型

定義:使用type建立用戶的自定義類型,包括基於現有的基礎類型、結構體、函數建立新的類型。ui

注意:即便type指定了新的類型,只能代表有相同的數據結構,兩個類型間沒有任何關係,不能視道別名指針

未命名類型

具備相同聲明的未命名類型視做同一種類型code

  1. 相同基類型的指針
  2. 相同元素類型和長度的數組(array)
  3. 相同元素類型的切片(slice)
  4. 相同鍵值類型的字典(map)
  5. 相同操做類型和方向的通道(channel)
  6. 相同字段序列的結構體,注意的是struct不相同也視做不一樣(struct)
  7. 相同簽名【參數和返回值相同】的函數(func)
  8. 具備相同方法集【方法名和方法簽名】的接口

未命名類型轉化規則:對象

  1. 所屬的類型相同
  2. 基礎類型相同,其中一個是未命名類型
  3. 數據類型相同,將雙向通道賦值給單向通道,且其中一個爲未命名類型
  4. 將默認值nil賦值給切片、字典、通道、指針、函數、接口
  5. 對象實現了目標接口

指針類型

能夠經過unsafe.Pointer轉換成uintptr進行指針加減法運算,但可能形成非法訪問。接口

【區別】

Pointer相似void 的萬能指針,可用來轉換指針類型,void 能安全持有對象成員,uintptr只是一種整數類型,不引用目標對象,沒法阻止垃圾回收對象內存。

零長度對象地址

是否相等和版本實現有關,不等於nil,即便長度爲0,對象依然合法存在,擁有合法的內存地址,和nil不同。在runtime/malloc.go中有個zerobase的全局變量,經過mallocgc分配的0長度的對象都使用這個地址。在棧上分配,爲調用mallocgc函數。

相關文章
相關標籤/搜索