Google Go 语言中哪些类型是可变的和不可变的?

2024-01-06

在 Google Go 中,我读到字符串是不可变的,好吧,但是是 int 吗? 那么其他类型呢?作为一个稍老的程序员,我更喜欢可变性,尽管我知道不变性的好处,但我更喜欢危险地生活。

了解哪些类型是可变的或不可变的将非常有帮助。


更新,我最关心的是取决于类型可变或不可变的实际问题。就像 Java 中的典型示例一样,如果您在循环中创建一个 String 并循环 10,000 次,您将创建 10,000 个 String,然后这些 String 将被垃圾收集。这实际上是我工作过的公司的一个项目中的一个严重问题。

问题是,Go 的不变性在某些情况下会导致同样的问题吗?

它会影响你应该如何对待变量。 (或者我认为是这样)。


再次更新,我还关心其他实际问题。知道某些东西是不可变的意味着我可以编写并行的代码,并且对对象的一个​​引用的更新不应更新其他引用。但有时我想做危险的事情,我想要可变性。

这些是可变性与不变性的后果,并影响我编写代码的方式。


别担心——如果你真的想的话,Go 会让你搬起石头砸自己的脚:-)

Go 与 Erlang 不同,这可能就是您提出问题的目的。

x := 1
x = 2

分配一个变量,x,值为1,然后将其重新分配给2-- 这里没有分配额外的内存。

正如您所注意到的,字符串是不可变的,因此进行字符串操作可能会导致生成副本。如果您发现想要对字符数据进行就地修改,您可能需要对以下变量进行操作[]byte通过bytes包裹。

Russ Cox 关于此的文章应该可以回答您有关基本数据结构的大部分问题:http://research.swtch.com/2009/11/go-data-structs.html http://research.swtch.com/2009/11/go-data-structures.html

正如其他评论者指出的那样,您需要查看 Go 函数的值语义——一开始它们可能会有点令人惊讶。

如果你有以下功能:

func (t MyType) myFunc() {
    // do something to set a field in t
}

然后你调用你的代码

myVar.myFunc()

你可能会惊讶地发现这并没有达到你想要的效果,因为t可见于myFunc()确实是一个copy of myVar.

但是,以下will work:

func (t *myType) myFunc() {
    // do something to set a field in t
}

因为该函数有一个副本pointer并可以通过该指针访问底层结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Go 语言中哪些类型是可变的和不可变的? 的相关文章

  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 模板中的 bson.ObjectId

    我有一个具有 bson ObjectId 类型的结构 例如如下所示 type Test struct Id bson ObjectId Name string Foo string 我想在 html 模板中呈现它 Name Food a h
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 为什么 gmail API 以纯文本形式发送 html 电子邮件?

    我正在尝试使用 gmail API 发送 html 电子邮件 但由于某些原因 它会随机以纯文本 文本形式发送电子邮件 谷歌似乎改变了我设置的内容类型标头 这有什么理由吗 电子邮件内容始终完全相同 正如我测试的那样 API 仍处于实验阶段吗
  • golang中通道缓冲容量0和1的区别

    我已将通道缓冲区大小设置为零 例如var intChannelZero make chan int 当从intChannelZero将被阻止 直到intChannelZero有价值 另外 我将通道缓冲区大小设置为 1 例如var intCh

随机推荐

  • 是否可以在 jUnit 测试运行期间禁用 log4j 异常输出?

    在 jUnit 测试运行期间需要禁用 log4j 输出到控制台 但应启用所有其他 log4j 输出 在测试过程中检查方法对错误参数的反应时会出现很多异常 因此异常是可以的 创建一个新的 log4j 属性文件 例如log4j test pro
  • Connect或Express中间件修改response.body [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想要一个修改响应正文的中间件函数 这是针对快速服务器的 就像是 function modify re
  • 在 Xamarin.iOS 中隐藏和显示控件

    我是 Xamarin iOS 初学者 我也没有太多 iOS 原生经验 我试图隐藏和显示包含 UILabel 和 UITextField 的 UIView 尽管视图的隐藏属性设置为 true 但它仍然占据屏幕中的空间 如何删除这个空格 如果我
  • 如何在Python中求解带有矩阵变量的方程?

    我正在用 Python 编码 并且正在研究立体相关 我想解这个方程 m K T M m K M 是已知的 where M是笛卡尔坐标系 世界 中点的齐次坐标 M np array X Y Z 1 K是我的左摄像头的内在矩阵 K np mat
  • 通过连接 iOS 中的表从 Firebase 获取数据

    我正在尝试从两个不同的 Firebase 表中获取数据 这是表的结构 Post 1 pImages i1 true i2 true 2 pImages i3 true Images i1 iUrl pId 1 i2 iUrl pId 1 i
  • numpy/scipy 中 N 点与参考之间的高效距离计算

    我刚刚开始使用 scipy numpy 我有一个100000 3的数组 每一行都是一个坐标 以及一个1 3的中心点 我想计算数组中每一行到中心的距离并将它们存储在另一个数组中 最有效的方法是什么 我会看一下scipy spatial dis
  • Azure 注销重定向 (post_logout_redirect_uri) 不起作用

    完成注销后 Azure 注销页面不会重定向用户 它只返回这条消息 您已退出帐户 关闭所有浏览器是个好主意 视窗 我尝试了不同的注销 URL https login microsoftonline com MY TENANT oauth2 l
  • 如何在Python中并行添加两个嵌套列表并将结果附加到新列表

    我正在尝试并行添加两个不等嵌套列表的所有元素 并将结果附加回另一个新列表 我编写了一些可以添加它们的黑客代码 但是代码有很多问题 首先我试图通过在列表末尾附加 0 来使这些对相等 但代码仍然遇到问题 因为第一对的长度是 3 第二对的长度是
  • Tkinter 从按钮动态创建小部件

    我正在尝试制作一个动态 GUI 其中单击按钮会创建一个新框架 该框架放置在按钮上方 其中包含 3 个条目小部件 用户选项 并且我需要能够从中读取用户输入3 个条目小部件并可能更改它们 每次按下按钮时 都会出现三个新的可调用条目小部件 我知道
  • lldb 无法打印调试代码中的值

    在 lldb 中打印值时 出现以下错误 error no member named rec in namespace lldb local vars 我的代码是用 g编译的 为什么 lldb 无法打印值 lldb local vars是为了
  • Nodejs 模块和重复?如果应用程序使用两个需要公共模块的模块,节点是否会进行优化以防止加载相同的代码两次?

    如果这是一个愚蠢的问题 我深表歉意 但是如果我创建两个模块 它们都需要 http 并且我的主应用程序需要这两个模块 或者需要模块 而这些模块又需要这两个模块 同时还需要 http 作为其自己的模块目的 我最终会得到 http 模块的三个实例
  • 使用 Lambda 语法的 C# LINQ 多个 GroupJoin

    我有 3 个表 我试图使用左连接将它们组合在一起 在我的应用程序中 所有 LINQ 表达式都是查询链格式 lambda 表达式 我试图弄清楚如何使用 LINQ 完成这个查询 这是我的 SQL 查询 select i INVOICE NUMB
  • 关于 SimpleModal jQuery 插件的问题——初始打开后可以重新居中吗?

    我的问题与SimpleModal jQuery 插件 http www ericmmartin com projects simplemodal 我打开模态窗口没有问题 但是一旦它打开 它就会停留在屏幕上 居中 的位置 但是它的内容正在发生
  • 如何防止在 Razor(独立)中转义 html?

    我有一个模型 其属性 Content 包含 HTML 字符串 var model new Content Razor Parse templateBody model 如何使用独立 Razor 渲染此字符串 I tried new Html
  • 为什么在 try 块中重新声明函数标识符会引发语法错误?

    以下 JavaScript 行 try function free var free 1 finally 导致以下错误 Uncaught SyntaxError Identifier free has already been declar
  • R 中从右到左的语言支持(使用 Mac)

    我想知道在使用 Mac 时是否有支持 R 中从右到左语言的方法 例如假设以下代码 x lt data frame a runif 10 b runif 10 ggplot x aes a b geom point xlab 结果如下 在这里
  • 绑定到静态类实例中的属性

    我想要实现的目标 我有一个 WPF 应用程序 仅用于测试 我想将标签的文本 内容 绑定到某处的属性 这个想法是 当用户选择不同的语言时 该属性值将会改变 当属性更改时 我希望标签文本更新为新值 我尝试过的 我尝试创建一个具有标签值静态属性的
  • 检查 Internet Explorer 中的伪元素

    我有以下伪元素 input type radio selected before 在互联网浏览器中 伪元素根本不显示 所以我决定看一下 我在检查器中找到了选择器 检查器中的选择器将是一本很棒的儿童读物 但是所有属性都被删除了 即覆盖 无效
  • webpack 构建中意外的令牌“导出”

    我收到的错误是 webpack 无法将导出识别为关键字 我已经更新了 babelrc 并安装了必要的依赖项 我确信这与不理解 es6 有关 但我找不到解决我的问题的解决方案 以下是查看我的依赖项 错误和重要文件所需的文件 index scs
  • Google Go 语言中哪些类型是可变的和不可变的?

    在 Google Go 中 我读到字符串是不可变的 好吧 但是是 int 吗 那么其他类型呢 作为一个稍老的程序员 我更喜欢可变性 尽管我知道不变性的好处 但我更喜欢危险地生活 了解哪些类型是可变的或不可变的将非常有帮助 更新 我最关心的是