首页 > 解决方案 > 具有混合返回/签名类型的 Go 函数

问题描述

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

func createNode(nodeInfo string) *TreeNode {
    return &TreeNode{info: nodeInfo}
}

我知道该函数正在返回创建的结构实例的内存地址,但是函数签名怎么说*TreeNode?根据我的理解,*是用来解引用指针来获取值本身的,那么这里发生了什么?

也在这里:

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

func main() {
  x := 5
  zero(&x)
}

相反的情况发生在函数接受带有*运算符的参数但函数本身正在使用&运算符调用的情况下。

标签: pointersgo

解决方案


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

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

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

在您的示例中,根据 types 的用途,返回类型 *TreeNode参数类型 *int表示您正在返回/期待一个指针。相反,取消引用变量*xPtr = 0 xPtr

要知道哪种用法在您的情况下是正确的,您必须清楚自己是在处理类型还是变量。

有关技术说明,您可以阅读语言规范中有关指针类型地址运算符的部分。


推荐阅读