pointers - 具有混合返回/签名类型的 Go 函数
问题描述
我试图弄清楚指针在 Go 中是如何工作的,我想我开始明白了,但这让我很困惑,我真的不知道要搜索什么。假设我有以下功能:
func createNode(nodeInfo string) *TreeNode {
return &TreeNode{info: nodeInfo}
}
我知道该函数正在返回创建的结构实例的内存地址,但是函数签名怎么说*TreeNode
?根据我的理解,*
是用来解引用指针来获取值本身的,那么这里发生了什么?
也在这里:
func zero(xPtr *int) {
*xPtr = 0
}
func main() {
x := 5
zero(&x)
}
相反的情况发生在函数接受带有*
运算符的参数但函数本身正在使用&
运算符调用的情况下。
解决方案
有*
2 种用途,一种用于变量,一种用于类型:
- 对于类型,它表示该类型是指针,而不是直接的值。
- 如您所知,对于变量,它取消引用指针。(人们也可以将此用途区分为两个“子用途”,如
*
赋值左侧,*ptr = val
设置指针指向的值,而*
通常“检索”指针指向的值。)
&
另一方面,只能用于变量并获取内存中对象的地址。
在您的示例中,根据 types 的用途,返回类型和 *TreeNode
参数类型 *int
表示您正在返回/期待一个指针。相反,取消引用变量。*xPtr = 0
xPtr
要知道哪种用法在您的情况下是正确的,您必须清楚自己是在处理类型还是变量。
推荐阅读
- c# - 无法连接到远程服务器 ---> 无法建立连接,因为目标机器主动拒绝它
- c++ - 如何在此函数中使用 millis() 而不是 for 循环
- neo4j - 当关系也有一些信息是节点时,设计neo4j图的最佳方法是什么
- java - 解析模板 [] 时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问
- powershell - 从 csv 更改远程服务器的密码
- javascript - 内容不显示在 Internet Explorer Web 浏览器中
- python - 如何使 numxepr 与 complex64 一起运行?
- javascript - 如果我们将 3 个参数传递给在 JavaScript 中用 2 个参数声明的函数,为什么我们不会出错
- batch-file - 如何仅将 cmd 中的特定文件移动到另一个文件夹?
- java - 为什么 Full GC 不能释放一些内存,但 JVMTI 触发的 ForceGarbageCollection 可以