我想加入两行,但收到错误消息。
原件:
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)
为什么?
答案 0 :(得分:8)
您在第二种情况下收到错误消息,因为您尝试对函数调用的返回值进行切片(sha1.Sum()
的返回值):
sha1.Sum(([]byte)(uf.Pwd))[:]
函数调用的返回值不可寻址。提醒一下,(仅)以下内容是可寻址的(取自Spec: Address operators):
...变量,指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或者可寻址数组的数组索引操作。作为可寻址性要求的例外,
x
也可能是(可能带括号的)composite literal。
切片数组需要数组可寻址。 Spec: Slice expressions:
如果切片操作数是一个数组,则它必须是addressable,并且切片操作的结果是一个与数组具有相同元素类型的切片。
你的第一个案例是有效的,因为你首先将返回的数组存储在一个可寻址的局部变量中。
切片数组要求数组是可寻址的,因为切片会产生一个切片,该切片不会复制数组的数据,而是创建一个共享支持数组的切片,并且只会指向/引用它。