《Go 精進之路》 讀書筆記。簡要記錄自己打五角星的部分,方便複習鞏固。目前看到p120 Go 語言遵從的設計哲學為組合 垂直組合:類型嵌入,快速讓一個類型復用其他類型已經實現的能力,實現功能的垂直擴展。 水平組合:介面實現鴨子類型。 變數名字中不要帶有類型信息 userSlice []*User ...
《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