【问题标题】:Why we need Pointers for assigning a value to a variable in Go/C but not C#/Java为什么我们需要指针来为 Go/C 中的变量赋值而不是 C#/Java
【发布时间】:2015-12-29 18:51:34
【问题描述】:

这实际上是一个普遍的问题,但现在我正在使用 Go 和 C#。 假设我们想根据用户在 Go 中的输入分配一个变量:

func main() {
    var input float64
    fmt.Scan(&input)
}

很清楚为什么我们需要一个内存位置来放置我们的新值。但是为什么在 Java 或 C# 等语言中,我们没有遵循相同的逻辑:

var input = Convert.ToInt32(Console.ReadLine());
// and not &input ...

【问题讨论】:

  • 这是一个陈述而不是一个问题。引用与价值在 C# 和 Java 中更加抽象。我个人认为这不是一件好事。在您的示例中,您不需要引用来执行分配,您必须通过引用来传递 Scan,因为它就是这样设计的。它不能是任何语言的值,所以在 C# 中,因为像 int 这样的类型总是值类型,它可能会返回值或使用 out 参数。
  • 嗯,关于对象如何在 C#/Java 中产生引用而不是在 Go 中的答案中的内容是正确的,但这个示例并没有真正涉及它,必然。您可以使用(*bufio.Reader).ReadString 读取字符串,使用strconv.Atoi 将其转换为int,并将其分配给Go 中的变量,尽管Scan 更短。

标签: c# pointers go


【解决方案1】:

Java 和 C# 是高级语言,它们抽象了 C 等低级语言所需的大部分内存管理和其他特定内容。

在这种情况下,Console.ReadLine() 函数分配内存来存储控制台输入并将其复制到input 变量。

由于这些语言有垃圾收集,分配和释放内存是自动完成的,所以框架不需要你显式传递一个内存地址来写入,也不希望你在完成后释放内存使用它。

编辑:

请参阅@kostix 评论以获得对此答案的重大改进。

【讨论】:

  • Go 有垃圾收集以及 C# 和 Java。 Go 与其他语言的关键区别在于,Go 的设计者努力使其具有尽可能少的magic。这样做的一个原因是使程序员仅通过查看代码就可以轻松估计运行时成本。另一个是降低“WTF 因素”:比如说,没有脑死的“值类型与引用类型”区别——一切都是值并按值传递,所以你传递的就是你得到的 ;-) 指针也是值,并在需要时使用它们。
  • 在 Java 和 C# 中,您大部分时间都使用对象引用,其中包含一个即使您不知道的指针。在 C# 中,如果您不希望您的类型隐式地获得对象通过引用传递的语义,则可以使用 struct。在 Go 中,您总是struct 或其他非指针类型开始,并且仅在被要求使用 */&/new 或由你做的其他事情(例如,切片、字符串、映射和funcinterface 值是用指针实现的)。
【解决方案2】:

在 Go 中,与 C/C++ 一样,指针变量是通过引用传递类型的方式。

Java 和 C# 等语言不鼓励使用指针变量。 C# 具有“ref”关键字和“boxing”,用于通过引用传递值类型。

有关“参考”的更多信息,请参见此处:https://msdn.microsoft.com/en-us/library/14akc2c7.aspx 有关“拳击”的更多信息,请参见此处:https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

【讨论】:

  • 另外,C# 有 IntPtr 和 Marshal 命名空间。
  • Java 也有装箱和拆箱。 (如果我没记错的话,int vs Integer)
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 2019-02-25
  • 2013-07-14
  • 2015-05-01
  • 1970-01-01
  • 2021-03-10
  • 2014-02-17
  • 2012-07-06
相关资源
最近更新 更多