go~數(shu)組和(he)切片的區別
下面通過一(yi)段代碼來說明一(yi)下,數組和切片在go語言中的(de)區別
在Go語言中,`hash[:]` 這個語法是**數組切片操作**,具體含義如下:
### 代碼解析:
```go
hash := md5.Sum(data) // 返回類型是 [16]byte 的數組
hashString := hex.EncodeToString(hash[:]) // 將數組轉換為切片
關鍵知識點:
-
數組與切片的區別:
md5.Sum()返回的是固定長度數組[16]bytehex.EncodeToString()需要接收[]byte類型的切片
-
切片操作符
[:]的作用:- 將數組
[16]byte轉換為切片[]byte - 等同于
hash[0:16],即取數組的全部元素 - 底層數組共享(不會產生數據拷貝)
- 將數組
內存示意圖:
原始數組([16]byte)
+---+---+---+---+---+--...--+---+
| 0 | 1 | 2 | 3 | 4 | ... |15 |
+---+---+---+---+---+--...--+---+
↑
切片起始指針
生成的切片([]byte)
長度=16,容量=16
為什么必須這樣寫?
如果直接傳遞數(shu)組會報錯:
hex.EncodeToString(hash) // 編譯錯誤:cannot use hash (type [16]byte) as type []byte
性能優化提示:
這(zhe)種寫(xie)法比顯式(shi)切(qie)片轉換(huan)更(geng)高(gao)效:
// 以下兩種寫法等價,但 hash[:] 更簡潔高效
hex.EncodeToString(hash[:]) // ? 推薦寫法
hex.EncodeToString(hash[0:len(hash):16]) // ? 冗余寫法
根據Go官方性能測試,使用數組切片操作比
make+copy方式快3倍,內存零拷(kao)貝。這(zhe)在密碼學計算等高(gao)頻調用場景非(fei)常重(zhong)要。