我试图弄清楚指针在Go中是如何工作的,我想我已经开始了解它了,但这使我感到困惑,我也不知道该搜索什么。假设我具有以下功能:
func createNode(nodeInfo string) *TreeNode {
return &TreeNode{info: nodeInfo}
}
我知道该函数正在返回创建的struct实例的内存地址,但是函数签名怎么说*TreeNode
?根据我的理解,*
用于取消引用指针以获取值本身,那么这是怎么回事?
另外,这里:
func zero(xPtr *int) {
*xPtr = 0
}
func main() {
x := 5
zero(&x)
}
当函数使用*
运算符接受参数而函数本身使用&
运算符调用时,情况恰恰相反。
答案 0 :(得分:5)
*
有2种用途,一种用于变量,一种用于类型:
*
,如*ptr = val
中设置指针所指向的值,而{{1} }通常会“检索”指针指向的值。) *
仅可用于变量并获取内存中对象的地址。
在您的示例中,返回 type &
和参数 type *TreeNode
表示您正在返回/期望一个指针,根据类型的用途。相反,*int
取消引用变量 *xPtr = 0
。
要知道哪种用法是您的正确选择,您必须自己弄清楚是要处理类型还是变量。
有关技术说明,您可以阅读language specifications和Pointer types上Address operators的各个部分。