【发布时间】:2015-11-17 03:41:47
【问题描述】:
我是一名 C++ 高级程序员。我目前正在做一些 Go 编程。我真正想念的唯一功能是 const 限定符。在 go 中,如果你想修改一个对象,你传递它的指针。如果您不想修改它,则按值传递它。但是如果结构很大,你应该通过指针传递它,这会覆盖不修改特性。更糟糕的是,您可以按值传递一个对象,但如果它包含一个指针,您实际上可以修改其内容,这会带来可怕的竞争条件危险。某些语言类型(例如地图和切片)具有此功能。这发生在一种应该为并发而构建的语言中。所以避免修改的问题在 Go 中真的不存在,你应该通过值传递 不包含指针 的小对象(你必须知道该对象不包含指针),如果他们不会被修改。
使用 const,您可以通过 const 指针传递对象,而不必担心修改。类型安全是关于拥有一个允许速度并防止与类型相关的错误的合同。另一个这样做的特性是 const 限定符。
【问题讨论】:
-
请注意,您可以(而且恕我直言应该)通过接口解决此问题;您可以定义一个接口来公开数据结构的不可变视图。回复:“更糟糕的是,你可以通过值传递一个对象,但如果它包含一个指针,你实际上可以修改它的内容”:在 C++ 中也是如此;请注意,
const不被指针成员传递继承。 -
@ruakh 但是在 C++ 中,您可以防止对象被复制,或者在复制时应用所需的语义(引用计数、深度复制等)。接口技术是有效的。例如,您可以/应该传递 Reader 接口而不是 *File。谢谢。
-
@peterSO 埃里克老兄的回答很糟糕。这不是关于保证,而是关于合同。您可以在函数中对对象进行 const 转换并对其进行修改,就像在 Go 函数中放置 if random % 1000000 == 0 { panic() } 一样。使用只读接口技术,您可以转换为原始对象并对其进行修改。 你不应该做任何一个。
-
至少从one of the developers 开始,它会是“虽然以某种方式将对象标记为不可变可能有一些好处,但我们认为 const 类型限定符不是很重要。”跨度>
标签: go