首頁  >  文章  >  後端開發  >  為什麼我不能在 Go 中對函數返回值進行切片?

為什麼我不能在 Go 中對函數返回值進行切片?

DDD
DDD原創
2024-10-24 18:25:33650瀏覽

Why Can't I Slice a Function Return Value in Go?

理解 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>

錯誤訊息表明切片函數呼叫的返回值存在問題。在 Go 中,函數呼叫的回傳值(例如 sha1.Sum() 中的回傳值)是不可尋址的。

要理解這種行為,了解 Go 中的可尋址類型非常重要。根據Go規範,只有以下內容是可尋址的:

  • 變數
  • 指標間接
  • 可尋址結構體的切片索引操作
  • 數組索引可尋址數組的操作
  • 複合文字(免除可尋址性要求)

由於sha1.Sum() 的回傳值不是這些類型之一,因此無法對其進行切片。對數組進行切片,按照這裡的要求,要求數組是可尋址的。

在原始程式碼的第一行中,傳回的陣列儲存在局部變數(雜湊)中,該變數是可尋址的。在第二行中,計算了 hex.EncodeToString(hash[:]),它按預期工作。

變數和傳回值之間的差異凸顯了理解 Go 尋址規則的重要性。遵循這些規則,您可以避免常見錯誤並編寫更健壯的程式碼。

以上是為什麼我不能在 Go 中對函數返回值進行切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn