首页 实战正文

这个代码竟然报错了?Go 的不可寻址值了解下

访客 实战 2020-07-24 18:27:55 38 0 错了解下代码
`sha1.Sum()`[1] 的返回值不寻常。大多数方法返回切片,而此代码对切片不会报错。但是 sha1.Sum() 返回的值很奇怪,它是一个固定大小的数组(具体来说是 [20]byte ),由于 Go 是返回数值的,这意味着它确实向 main() 返回了 20 字节的数组,而不是指向它的指针。地址运算符[2] 中。简单来说,大多数匿名值都不可寻址( 复合字面值[3] 是一个大大的例外)。在上面的代码中,sha1.Sum() 的返回值是匿名的,因为我们立即对其进行了切片操作。如果我们将它存在变量中,并因此使其变为非匿名,则该代码不会报错:Slice 表达式[4] 的末尾介绍)。sha1.Sum() 返回的匿名数组是不可寻址的,因此对其进行切片会被编译器拒绝。x86-64 上的 Go 低级调用惯例[5] 中所述,由于 Go 返回了栈中的所有值,因此需要将数据进行拷贝。对于 sha1.Sum() 的 20 字节的返回值来说,这并不是什么大事。我很确定人们经常使用更大的结构体作为返回值。)赋值[6] 操作需要可寻址性。补充:方法调用和可寻址性调用[7] 部分进行了介绍)。但是,由于此简便写法需要获取地址,因此需要可寻址性。因此,以下操作会报错:之前的一篇文章[8] 中提到过)Chris wSiebenmann[9]译者:zhiyu-tracy-yang[10]校对:polaris1119[11]GCTT[12] 原创编译,Go 中文网[13] 荣誉推出参考资料

[1]


sha1.Sum(): https://golang.org/pkg/crypto/sha1/#Sum


[2]


地址运算符: https://golang.org/ref/spec#Address_operators


[3]


复合字面值: https://golang.org/ref/spec#Composite_literals


[4]


Slice 表达式: https://golang.org/ref/spec#Slice_expressions


[5]


x86-64 上的 Go 低级调用惯例: /zb_users/upload/2020/07/24/b0o4i53cjws.html

[6]


赋值: https://golang.org/ref/spec#Assignments


[7]


调用: https://golang.org/ref/spec#Calls


[8]


之前的一篇文章: https://utcc.utoronto.ca/~cks/space/blog/programming/GoInterfacesAutogenFuncs


[9]


Chris wSiebenmann: https://utcc.utoronto.ca/~cks/space/People/ChrisSiebenmann


[10]


zhiyu-tracy-yang: https://github.com/zhiyu-tracy-yang


[11]


polaris1119: https://github.com/polaris1119


[12]


GCTT: https://github.com/studygolang/GCTT


[13]


Go 中文网: /zb_users/upload/2020/07/24/wjeg0eo3o40

私聊小编,领全套Go资料,每天学习 Go 语言!


版权声明

旭日软件园-提供免费小软件下载,电脑教程和QQ表情包下载为主要宗旨.同时有网站运营,
编程教程,网页特效,手机教程,游戏攻略和IT资讯等内容,打造常用软件下载、内容丰富的站长学习!

本文链接:http://www.webmaster5u.com/sz/390.html

评论