函數中變數和回傳值之間的不同行為
在Go 中使用函數時,請理解變數和回傳值之間的區別至關重要
原始程式碼和錯誤
考慮以下程式碼片段:
<code class="go">hash := sha1.Sum([]byte(uf.Pwd)) u.Pwhash = hex.EncodeToString(hash[:])</code>
此程式碼的功能如下預期的。但是,如果我們嘗試合併這兩行:
<code class="go">u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])</code>
我們會遇到以下錯誤:
models/models.go:104: invalid operation sha1.Sum(([]byte)(uf.Pwd))[:] (slice of unaddressable value)
錯誤原因
出現錯誤的原因是在組合行中,我們嘗試直接對函數sha1.Sum() 的回傳值進行切片:
<code class="go">sha1.Sum(([]byte)(uf.Pwd))[:]</code>
Go 中的函數傳回值是無法定址的。根據語言規範,可尋址值包括變數、指標間接定址、切片索引操作、可尋址結構的欄位選擇器、可尋址數組的陣列索引操作,以及作為例外的複合文字。切片數組需要數組可尋址。
解
原始程式碼之所以有效,是因為我們首先將sha1.Sum() 的回傳值指派給局部變數(雜湊),這使得數組可尋址,從而適合切片。因此,通常建議在對變數執行操作之前將返回值儲存在變數中,以避免此類錯誤並確保可尋址性。
以上是**為什麼我不能對 Go 中函數的回傳值進行切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!