Go函数具有返回/签名混合类型

时间:2018-09-19 20:56:44

标签: pointers go

我试图弄清楚指针在Go中是如何工作的,我想我已经开始了解它了,但这使我感到困惑,我也不知道该搜索什么。假设我具有以下功能:

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

我知道该函数正在返回创建的struct实例的内存地址,但是函数签名怎么说*TreeNode?根据我的理解,*用于取消引用指针以获取值本身,那么这是怎么回事?

另外,这里:

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

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

当函数使用*运算符接受参数而函数本身使用&运算符调用时,情况恰恰相反。

1 个答案:

答案 0 :(得分:5)

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

  • 对于类型,它表示类型是指针,而不是直接的值。
  • 对于变量,它已经取消了对指针的引用,这已经众所周知。 (也可以将这种用法分为两个“子用法”,如赋值左侧的*,如*ptr = val中设置指针所指向的值,而{{1} }通常会“检索”指针指向的值。)
另一方面,

*仅可用于变量并获取内存中对象的地址。

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

要知道哪种用法是您的正确选择,您必须自己弄清楚是要处理类型还是变量。

有关技术说明,您可以阅读language specificationsPointer typesAddress operators的各个部分。