go - Go 没有 const 限定符的理由是什么?

标签 go

我是一名 C++ 高级程序员。我目前正在做一些围棋编程。我真正怀念的唯一特性是 const 限定符。在go中,如果你想修改一个对象,你传递它的指针。如果您不想修改它,则按值传递它。但是如果结构很大,你应该通过指针传递它,这会覆盖不可修改的特性。更糟糕的是,你可以按值传递一个对象,但如果它包含一个指针,你实际上可以修改它的内容,这会带来可怕的竞争条件危险。某些语言类型(例如 map 和 slice )具有此功能。这发生在一种应该为并发而构建的语言中。所以避免修改的问题在 Go 中真的不存在,你应该按值传递不包含指针的小对象(你必须知道对象不包含指针),如果他们不会被修改。

有了const,你可以通过const指针传递对象,不用担心修改。类型安全是关于拥有一个允许速度并防止与类型相关的错误的契约(Contract)。执行此操作的另一个功能是 const 限定符。

最佳答案

C/C++中的const类型限定符有多种含义。当应用于变量时,这意味着该变量是不可变的。这是一项有用的功能,也是 Go 中缺少的功能,但它似乎不是您正在谈论的功能。

您正在谈论 const 可以用作函数的部分强制契约的方式。函数可以为指针参数提供 const 限定符,表示该函数不会使用该指针更改任何值。 (当然,除非函数使用强制转换(C++ 中的 const_cast)。或者,在 C++ 中,指针指向声明为 mutable 的字段。)

Go 有一个非常简单的类型系统。许多语言都有一个复杂的类型系统,您可以在其中通过编写类型来强制程序的正确性。在许多情况下,这意味着大量编程涉及编写类型声明。 Go 采用不同的方法:您的大部分编程都涉及编写代码,而不是类型。您通过编写正确的代码来编写正确的代码,而不是通过编写能够捕获您编写错误代码的情况的类型。如果您想捕获不正确的代码,您可以编写分析器,例如 go vet 来查找代码中无效的情况。为 Go 编写这些类型的分析器比为 C/C++ 编写要容易得多,因为语言更简单。

这种方法有优点也有缺点。 Go 在这里做出了明确的选择:编写代码,而不是类型。这不是每个人的正确选择。

关于go - Go 没有 const 限定符的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33712242/

相关文章:

go - 在 Go 中连接两个 slice

programming-languages - 移植到 AVR 架构?

go - Go 中的 .a 文件是什么?

json - 戈朗 : Validate Struct field of type string to be one of specific values

go - map.LoadOrStore 返回的地址值是否与嵌套 map 的输入相同?

arrays - slice 可以引用不同索引范围中的差异数组/slice ,还是有方便的解决方法?

pointers - Gob 无法使用 nil 指针值对映射进行编码

go - 在 golang 中使用可变长度数组作为映射键

windows - 问golang中的LookupTXT函数

go - 需要帮助理解为什么 select{} 不会永远阻塞