为了账号安全,请及时绑定邮箱和手机立即绑定

go中的“不能分配给取消引用”是什么意思?

go中的“不能分配给取消引用”是什么意思?

Go
小唯快跑啊 2022-07-04 16:35:51
我正在学习围棋,直到我在书中看到它之前,我对“指针”一无所知。这是我的代码:var num int = 1var numPtr4 *int = &num *numPtr4 = num&num = numPtr4 // Error occur: cannot assign to &numfmt.Println( num, &num, numPtr4, *numPtr4)我试图将指针变量(numPtr4)分配给num的内存地址(使用&),但它失败了。我错过了什么?和,var c Circlevar c1 *Circlec1 = new(Circle) c2 := new(Circle) fmt.Println(c, c1, c2) // {0 0 0} &{0 0 0} &{0 0 0}我猜 c1 和 c2 是指针变量,但它们返回它们的初始化值而不是它们的地址。为什么他们不返回地址?
查看完整描述

4 回答

?
www说

TA贡献1775条经验 获得超8个赞

在第一种情况下,num 是具有分配内存位置的 int 类型。Golang 不允许您编辑该变量的内存地址。这不是一个可以为语言提供太多价值的功能。

在第二种情况下,golang 试图假设您想要什么,即打印数据,无论它是否是指针。在标准情况下,这是正确的选择。除非在这种情况下,当您学习指针时,知道内存位置对您没有什么帮助。

要打印内存位置,请使用 %p


查看完整回答
反对 回复 2022-07-04
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

在您的示例代码numPtr4 = num中也失败了,所以我收到两个错误(操场):。

./prog.go:10:10: cannot use num (type int) as type *int in assignment
./prog.go:11:7: cannot assign to &num

我认为第一个错误是不言自明的;var numPtr4 *int = &num创建一个变量numPtr4,它是指向int. 然后你不能分配一个int。请注意,一种更简单的创建方法numPtr4(具有相同的结果)是numPtr4 := &num.

第二个错误(cannot assign to &num)是您要询问的错误;让我们看看是什么#从go 规范

对于 T 类型的操作数 x,地址操作 &x 生成 *T 类型的指向 x 的指针。. 操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。

因此&num导致指向num. 您的声明似乎试图创建一个指向num&num) 的指针并为其分配一个值(这没有意义,因为结果会丢失)。Go 规范中关于assignments的部分禁止这种事情:

每个左侧操作数必须是可寻址的、映射索引表达式或(仅用于 = 分配)空白标识符。操作数可以用括号括起来。

有关 addressable 的定义,请参见前面的引用

您可以实现您想要的num = *numPtr4(但是归结为num = num它在这种情况下没有多大意义)。

参考fmt.Println(c, c1, c2) // {0 0 0} &{0 0 0} &{0 0 0}Println的文档指出:

Println 使用其操作数的默认格式格式化并写入标准输出。

有关格式的信息,请参阅此部分- 相关部分标题以“对于复合对象...”开头。当输出一个指针时,你最想看到的是它所指向的东西(这是默认给你的)。正如其他人所指出的,您可以将值作为地址输出fmt.Printf("%p",c1)


查看完整回答
反对 回复 2022-07-04
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

num 不是指针,您可以以这种方式写入内存,因此重构您的代码(* 表示取消引用(setter)& 表示引用(getter)), *将采用内存地址(&varname)&varname 表示它应该在哪里像这样


var num *int

var numPtr4 *int 

numPtr4 = num

num = numPtr4 // Error occur: cannot assign to &num

fmt.Println( num, &num, numPtr4, *numPtr4)


查看完整回答
反对 回复 2022-07-04
?
当年话下

TA贡献1890条经验 获得超9个赞

使用fmt.Printf的格式化动词%p来呈现内存地址:

fmt.Printf("%v %p %p\n", c, c1, c2)


查看完整回答
反对 回复 2022-07-04
  • 4 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信