go~數組和切片的區別
下面通過一段代碼來說明一下,數組和切片在go語言中的區別
在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
為什么必須這樣寫?
如果直接傳遞數組會報錯:
hex.EncodeToString(hash) // 編譯錯誤:cannot use hash (type [16]byte) as type []byte
性能優化提示:
這種寫法比顯式切片轉換更高效:
// 以下兩種寫法等價,但 hash[:] 更簡潔高效
hex.EncodeToString(hash[:]) // ? 推薦寫法
hex.EncodeToString(hash[0:len(hash):16]) // ? 冗余寫法
根據Go官方性能測試,使用數組切片操作比
make+copy方式快3倍,內存零拷貝。這在密碼學計算等高頻調用場景非常重要。
浙公網安備 33010602011771號