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

我正在学习围棋,直到我在书中看到它之前,我对“指针”一无所知。这是我的代码:


var num int = 1

var numPtr4 *int = &num 

*numPtr4 = num

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

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

我试图将指针变量(numPtr4)分配给num的内存地址(使用&),但它失败了。我错过了什么?


和,


var c Circle

var c1 *Circle

c1 = new(Circle) 

c2 := new(Circle) 

fmt.Println(c, c1, c2) // {0 0 0} &{0 0 0} &{0 0 0}

我猜 c1 和 c2 是指针变量,但它们返回它们的初始化值而不是它们的地址。为什么他们不返回地址?


小唯快跑啊
浏览 148回答 4
4回答

www说

在第一种情况下,num 是具有分配内存位置的 int 类型。Golang 不允许您编辑该变量的内存地址。这不是一个可以为语言提供太多价值的功能。在第二种情况下,golang 试图假设您想要什么,即打印数据,无论它是否是指针。在标准情况下,这是正确的选择。除非在这种情况下,当您学习指针时,知道内存位置对您没有什么帮助。要打印内存位置,请使用 %p

米琪卡哇伊

在您的示例代码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)。

慕尼黑8549860

num 不是指针,您可以以这种方式写入内存,因此重构您的代码(* 表示取消引用(setter)& 表示引用(getter)), *将采用内存地址(&varname)&varname 表示它应该在哪里像这样var num *intvar numPtr4 *int numPtr4 = numnum = numPtr4 // Error occur: cannot assign to &numfmt.Println( num, &num, numPtr4, *numPtr4)

当年话下

使用fmt.Printf的格式化动词%p来呈现内存地址:fmt.Printf("%v %p %p\n", c, c1, c2)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go