《Go 精進之路》 讀書筆記 (第一次更新)

《Go 精進之路》 讀書筆記。簡要記錄自己打五角星的部分,方便複習鞏固。目前看到p120

Go 語言遵從的設計哲學為組合

垂直組合:類型嵌入,快速讓一個類型復用其他類型已經實現的能力,實現功能的垂直擴展。

水平組合:介面實現鴨子類型。

變數名字中不要帶有類型資訊

userSlice []*User [BAD]
users []*User [Good]

程式語言命名的管理:保持變數聲明與使用之間的距離越近越好,或者在第一次使用變數之前聲明該變數。就近原則

介面使用

盡量定義小介面,並通過介面組合的方式構建程式。

無類型常量

無類型常量擁有字面值的特性,在參與變數賦值和計算過程時無需顯式進行轉換。

無類型常量也擁有自己的默認類型(用於賦值確定無類型變數、介面變數的類型)

const 聚類聲明

每行隱式重複前一個非空表達式。iota 也是無類型常量(維護枚舉常量列表更容易

零值可用

像切片,sync.mutex等的結構體為零值可用狀態。使用者可以省略初始化直接使用綁定的相關方法。

零值可用的類型需要注意盡量避免值複製,可以傳遞指針

描述符

切片是數組的描述符

hmap是map的描述符

遍歷map

go運行時初始化map迭代器的時候會做隨機處理,因此不要依賴遍歷map得到的元素次序。可以將key存儲在一個切片里再循環拿key遍歷map輸出。

不要獲取map數據元素地址

map可以自動擴容,當overflow buckets過多或存儲元素過多會造成「擴容」。導致原來元素被搬遷至新地方。

字元串是通過切片構造的,然後切片被回收

字元串的結構為 {str 指向底層位元組數組,len 長度}

直接將string類型通過函數、方法傳入不會有太多損耗,因為傳入的僅僅是一個描述符,而不是字元串數據。

多使用string.Builder或strings.Join

做了預初始化的strings.Builder連接構建字元串效率最高。如果多個字元串是以[]string承載的,那麼用strings.Join構建字元串其平均性能最穩定。

直接使用切片的底層存儲當成string的底層節省記憶體分配操作

  • string(位元組切片)用在map的key中
  • string(位元組切片)用在字元串連接語句中
  • string(位元組切片)用在字元串比較中

for range 中轉換字元串為位元組切片節省記憶體分配操作

for _,v := range []byte("直接使用字元串的底層位元組數組"){

}

盡量使用預估的大小創建

  • 創建map
  • 創建切片
  • 創建strings.Builder
  • 創建bytes.Buffer
Tags: