我一直在浏览并试图理解Go website上的示例,并且在这样的示例中不断遇到特殊的星号字符:
s := "hello"
if s[1] != 'e' {
os.Exit(1)
}
s = "good bye"
var p *string = &s
*p = "ciao"
还有,我刚刚注意到,&s
是怎么回事?它是通过引用赋值的吗(我可能在这里使用PHP)?
我一直在浏览并试图理解Go website上的示例,并且在这样的示例中不断遇到特殊的星号字符:
s := "hello"
if s[1] != 'e' {
os.Exit(1)
}
s = "good bye"
var p *string = &s
*p = "ciao"
还有,我刚刚注意到,&s
是怎么回事?它是通过引用赋值的吗(我可能在这里使用PHP)?
7条答案
按热度按时间pkbketx91#
附加到类型(
*string
)的*
表示指向该类型的指针。*
附加到赋值中的变量(*v = ...
)表示间接赋值。也就是说,更改变量所指向的值。附加到变量或表达式(
*v
)的*
表示指针解引用。也就是说,取变量所指向的值。附加到变量或表达式(
&v
)的&
表示引用。也就是说,创建一个指向变量值或字段的指针。jq6vz3qz2#
我猜它的意思和C中的一样
p is a pointer to a string
语句
var p *string = &s
将把s
对象的地址分配给p
下一行
*p = "ciao"
将更改s
的内容请参阅语言设计常见问题解答中的此链接
有趣的是,没有指针算术
为什么没有指针算法?安全性。如果没有指针算法,就有可能创建一种语言,它永远不会派生出一个非法的地址,而这个地址会错误地成功。编译器和硬件技术已经发展到使用数组索引的循环可以与使用指针算术的循环一样高效的程度。此外,缺少指针算法可以简化垃圾收集器的实现。
fwzugrvs3#
*Go lang * 地址、指针和类型:
所有这些Go变量都有一个address in memory。它们之间的区别是字符串类型保存字符串值,int类型保存整数值,指针类型保存 * 地址 *。因此,即使是保存地址的变量也有自己的内存地址。
指针:
在变量名计算为它的地址之前添加
&
。或者想:“这是我的地址,这样你就知道在哪里能找到我。”在指针变量之前添加
*
会取消引用它所保存的地址的指针。或者想,“把动作传递到我的值所在的地址。”在这里玩:http://play.golang.org/p/u3sPpYLfz7
xiozqbni4#
我是这么看的不同的措辞可能有助于人们更好地理解它(您可以复制粘贴代码并检查输出):
xpszyzbs5#
*
字符用于在C和Go中定义指针。变量不是一个真实的值,而是一个指向值位置的地址。&
运算符用于获取对象的地址。eivnm1vs6#
我不知道Go,但基于语法,它似乎类似于C -这是一个指针。它类似于一个参考,但更低的水平和更强大。它包含所讨论项目的内存地址。
&a
获取一个变量的内存地址,*a
取消引用它,获取内存地址处的值。此外,声明中的
*
意味着它是一个指针。所以是的,这就像PHP中的
s
的值被改变了,因为p
和&s
指向同一个内存块。euoag5mw7#
golang中的 * 作为指针。指针保存值的内存地址。
类型 *T是指向T值的指针。它的零值是nil。
&运算符生成指向其操作数的指针。
这被称为“解引用”或“定向”。
与C语言不同,Go语言没有指针运算。