4 回答
TA贡献1775条经验 获得超8个赞
在第一种情况下,num 是具有分配内存位置的 int 类型。Golang 不允许您编辑该变量的内存地址。这不是一个可以为语言提供太多价值的功能。
在第二种情况下,golang 试图假设您想要什么,即打印数据,无论它是否是指针。在标准情况下,这是正确的选择。除非在这种情况下,当您学习指针时,知道内存位置对您没有什么帮助。
要打印内存位置,请使用 %p
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
)是您要询问的错误;让我们看看是什么&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)
。
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)
- 4 回答
- 0 关注
- 147 浏览
添加回答
举报