Dar*_*ius 0 pointers reference go memory-address dereference
例如,当初始化一个指向 int 的指针时,我们使用:
var pointer *int
Run Code Online (Sandbox Code Playgroud)
为什么语法不是:
var pointer &int
Run Code Online (Sandbox Code Playgroud)
对我来说,第二个版本更有意义,因为它读起来像“变量‘指针’是一个整数的内存地址”
或者换句话说,我发现“*”既用于定义内存地址类型(如上所述)又用于取消引用,例如 *pointer = 123
这是否像看起来那样令人困惑,还是我在这里遗漏了什么?
&是地址运算符,而不是类型。
对于
x类型为 的操作数T,地址操作&x生成类型*T为 to的指针x。
但确实*也用作指针间接:
一个操作数
x指针类型的*T,所述指针间接*x表示类型的变量T指向x
正如Go 之旅中所见,同时*引用类型和运算符。
当然,指针语法只是从 C 复制而来。
另请参阅Go 的声明语法
如果我们使用了 '&',那么 Go 指针看起来就像一个 C++ 引用。
和:
*int定义一个指针类型,然后可以在有或没有*变量的情况下使用。
- 随着
*您访问指向的值。- 没有,您访问指向的内存地址。
&从变量中检索内存地址。地址不是指针,反之亦然。
您可以使用内存地址定义指针。Run Code Online (Sandbox Code Playgroud)var x int = 10 // declare an int variable `x` holding the value 10. var y *int = &x // Create a pointer `y` *using* the memory address of `x`.
*y将有值 10。
y将是内存地址x
在Dave Cheney 的“ Pointers in Go ”中查看更多信息:
Go 指针,就像 C 指针一样,是指向其他值的值。这是一个非常重要的概念,不应被视为危险或需要挂断的东西。
但:
您不能更改地址 p 指向的地址,除非您为其分配另一个地址
No:var p *int; p++可能。
(另见“ Go at Google:软件工程服务中的语言设计”)
一旦一个值被赋值给一个指针,除了 nil 之外,Go 保证被指向的东西在指针的生命周期内将继续有效。