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

Mic*_*ael 4 variables return-value go slice

我想加入两行,但是收到错误消息.

原版的:

hash := sha1.Sum([]byte(uf.Pwd))
u.Pwhash = hex.EncodeToString(hash[:])
Run Code Online (Sandbox Code Playgroud)

联合:

u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])
Run Code Online (Sandbox Code Playgroud)

第一个工作正常,第二个产生错误消息:

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

这是为什么?

icz*_*cza 8

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

sha1.Sum(([]byte)(uf.Pwd))[:]
Run Code Online (Sandbox Code Playgroud)

函数调用的返回值不可寻址.提醒一下,(仅)以下是可寻址的(取自Spec:Address运算符):

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

切片数组需要数组可寻址.规范:切片表达式:

如果切片操作数是数组,则它必须是可寻址的,并且切片操作的结果是具有与数组相同的元素类型的切片.

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

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