- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我是一名 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/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!