2015-09-28 53 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和切片操作的结果是具有相同的元素类型与阵列的切片。

您的第一种情况是因为您首先将返回的数组存储在可寻址的局部变量中。

切片数组要求数组是可寻址的,因为切片会产生一个不会复制数组数据的切片,但会创建一个共享后备数组的切片并仅指向/引用它。