使用混合返回/签名类型的Go函数

nin*_*alt 1 pointers go

我正在试图弄清楚Go中的指针是如何工作的,我想我已经开始明白了,但这让我感到困惑,我真的不知道该搜索什么.假设我有以下功能:

func createNode(nodeInfo string) *TreeNode {
    return &TreeNode{info: nodeInfo}
}
Run Code Online (Sandbox Code Playgroud)

我知道函数返回创建的struct实例的内存地址,但函数签名怎么说*TreeNode?根据我的理解,*用于取消引用指针以获取值本身,所以这里发生了什么?

也在这里:

 func zero(xPtr *int) {
  *xPtr = 0
}

func main() {
  x := 5
  zero(&x)
}
Run Code Online (Sandbox Code Playgroud)

相反的情况发生在函数接受*运算符的参数但函数本身是用&运算符调用的情况.

Leo*_*eon 5

*有2种用途,一个变量,一个用于类型:

  • 对于类型,它表示类型是指针,而不是直接的值.
  • 对于变量,它会取消引用指针,如您所知.(也可以将此用法区分为两个"子用途",如*在赋值的左侧,如*ptr = val设置指针指向的值,同时*通常"检索"指针指向的值.)

& 另一方面,只能用于变量并获取内存中对象的地址.

在您的示例中,返回类型 *TreeNode和参数类型 *int表示您根据类型的用途返回/期望指针.相反,*xPtr = 0取消引用变量 xPtr.

要知道在您的情况下哪个用途是正确的,您必须明确自己是在处理类型还是变量.

对于技术的描述,你可以阅读的部分语言规范指针类型地址运营商.