【问题标题】:Go pointer dereferencingGo 指针解引用
【发布时间】:2021-12-08 02:56:43
【问题描述】:

我目前正在尝试学习 GO,主要了解和使用 Java、ASP.Net 和一些 Python,没有使用类似 C 的指针的经验,这导致了我目前的困惑。

我目前用来编写我的第一个 GO 项目的库名为 Commando。 我有结构CommandRegistry,感兴趣的变量称为Commands。

在结构体中,变量描述如下:

// registered command configurations
Commands map[string]*Command

乍一看,我将其理解为一个包含字符串列表的 Map 对象,但它也显示了对实际 Command 对象的指针引用。

我所看到的只是它是一个我可以循环的映射,它返回命令的名称(字符串), 但是我想知道类型描述中的 *Command 是否意味着我可以以某种方式取消引用指针并检索对象本身以提取它的附加信息。

据我所知,& 操作数用于创建另一个对象的新指针。 Pass-by-reference 基本上代替了pass-by-value。 而* 操作数通常表示对象是指针或用于在新函数中需要指针。

有没有办法可以检索 Command 对象,或者为什么该类型的声明中包含 *Command

【问题讨论】:

  • 这是一个映射,因此您可以获得字符串键的值 Commands["key"] 应该为您提供指向命令的指针。在 Java 中,这将被声明为 Map<String, Command> - 没有指针。
  • Commands是一个映射,它从字符串值映射到*Command,即指向Command的指针。索引地图将为您提供关联的*Command 指针,例如Command["foo"]。您可以取消引用它(如果它不是nil)。您还可以使用循环遍历地图,获取所有键值对,如下所示:for s, cmd := range Commands { fmt.Printf("key: %s, value: %v", s, cmd) }
  • 非常感谢您的快速cmets。事实上,我似乎被指针这个新话题蒙蔽了双眼,忽略了一个简单的解决方案,即它仍然是一个声明不同的映射。
  • 请注意,在大多数情况下,您不必取消引用指针,您可以访问结构的字段并使用指针调用它的方法,这对于取消引用基本上是很短的,因此您不必不必每次都这样做。

标签: go pointers dereference


【解决方案1】:

Commands 是一个映射(字典),它以字符串为键,以指向命令的指针为值。通过向它传递一个键,您将获得一个指向它所属命令的指针。然后,您可以使用* 运算符取消引用指向实际Command 对象的指针。类似dereferencedCommand := *Commands["key"]

* 运算符可能会让人很困惑,至少对我来说是这样。当用作类型时,它表示我们正在接收某个变量的内存地址。但是要将内存地址取消引用到具体类型,您还可以使用 * 运算符。

【讨论】:

  • 非常感谢*运算符的回答和解释。对于第一种类型使用它确实有点令人困惑。
猜你喜欢
  • 2015-01-20
  • 2011-01-24
  • 1970-01-01
  • 2014-01-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多