2015-09-28 89 views
4

我想加入兩行,但我收到一條錯誤消息。函數的變量和返回值的不同行爲

原文:

hash := sha1.Sum([]byte(uf.Pwd)) 
u.Pwhash = hex.EncodeToString(hash[:]) 

聯合:

u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:]) 

第一個工作正常,第二個產生錯誤信息:

models/models.go:104: invalid operation sha1.Sum(([]byte)(uf.Pwd))[:] (slice of unaddressable value) 

這是爲什麼?

sha1.Sum(([]byte)(uf.Pwd))[:] 

的函數調用的返回值不可尋址:

回答

9

,因爲你嘗試切片函數調用(即的sha1.Sum())的返回值,你得到的第二種情況的錯誤消息。作爲提醒,(僅)以下是可尋址的(取自Spec: Address operators):

...變量,指針間接或片索引操作;或可尋址結構操作數的字段選擇器;或可尋址陣列的數組索引操作。作爲尋址能力要求的例外,x也可以是(可能括號的)composite literal

並且切片數組需要數組是可尋址的。 Spec: Slice expressions:

如果切片操作數是一個陣列,它必須是addressable和切片操作的結果是具有相同的元素類型與陣列的切片。

您的第一種情況是因爲您首先將返回的數組存儲在可尋址的局部變量中。

切片數組要求數組是可尋址的,因爲切片會產生一個不會複製數組數據的切片,但會創建一個共享後備數組的切片並僅指向/引用它。