变量的不同行为和函数的返回值

时间:2015-09-28 08:49:36

标签: variables go return-value slice

我想加入两行,但收到​​错误消息。

原件:

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)

为什么?

1 个答案:

答案 0 :(得分:8)

您在第二种情况下收到错误消息,因为您尝试对函数调用的返回值进行切片(sha1.Sum()的返回值):

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

函数调用的返回值不可寻址。提醒一下,(仅)以下内容是可寻址的(取自Spec: Address operators):

  

...变量,指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或者可寻址数组的数组索引操作。作为可寻址性要求的例外,x也可能是(可能带括号的)composite literal

切片数组需要数组可寻址。 Spec: Slice expressions:

  

如果切片操作数是一个数组,则它必须是addressable,并且切片操作的结果是一个与数组具有相同元素类型的切片。

你的第一个案例是有效的,因为你首先将返回的数组存储在一个可寻址的局部变量中。

切片数组要求数组是可寻址的,因为切片会产生一个切片,该切片不会复制数组的数据,而是创建一个共享支持数组的切片,并且只会指向/引用它。