Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 什么是';无法分配给取消引用';你是说围棋?_Go_Pointers - Fatal编程技术网

Go 什么是';无法分配给取消引用';你是说围棋?

Go 什么是';无法分配给取消引用';你是说围棋?,go,pointers,Go,Pointers,我正在学习围棋,直到我在书中看到它,我才知道“指针”是什么。这是我的密码: 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 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
的内存地址(使用
&
),但失败了。我错过了什么

以及

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

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

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

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

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


要打印内存位置,在示例代码中使用%p
numPtr4=num
也会失败,因此我得到两个错误():

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

第二个错误(
无法分配给&num
)就是您要询问的错误;让我们看看什么是
&num
;从:

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

因此,
&num
会产生一个指向
num
的指针。您的语句似乎试图创建一个指向
num
&num
)的指针,并为其赋值(这没有意义,因为结果将丢失)。上的Go spec部分禁止此类操作:

每个左手边操作数必须是可寻址的,一个MAP索引表达式,或者(for =赋值)空白标识符。操作数可以用括号括起来

有关可寻址的定义,请参见前面的引文

您可以使用
num=*numPtr4
实现您似乎想要的功能(但是,由于这归结为
num=num
,因此在这种情况下没有多大意义)

Ref
fmt.Println(c,c1,c2)/{0}&{0 0}&{0 0}
;各国的文件:

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


有关格式的信息,请参见-相关章节标题以“对于复合对象…”开头。当输出一个指针时,你最想看到的东西是它指向的任何东西(这是默认设置给你的)。正如其他人所指出的,当使用
fmt.Println
时,您可以使用
fmt.Printf(“%p”,c1)

将值作为地址输出(或
fmt.Printf
使用
%v
格式,除了换行外,其他格式大致相同),
fmt
包对指针进行了大量的特殊情况处理,以打印指针指向的内容,而不仅仅是打印原始值。这样做的结果是,您无法通过使用
fmt
来识别指针。那么,为什么打印指针地址(例如&num、numPtr)会起作用呢?在这个时候去不去设想?
fmt.Printf("%v %p %p\n", c, c1, c2) 
./prog.go:10:10: cannot use num (type int) as type *int in assignment
./prog.go:11:7: cannot assign to &num