在Google Go中,我读到字符串是不可变的,但int是吗?

知道哪些类型是可变的或不可变的会非常有帮助.


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

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

它会影响您应该如何对待VaR.(或者我想是的).


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

这些是可变性与不可变性的结果,并影响我如何编写代码.

推荐答案

别担心——如果你真的想的话,Go会让你射中自己的脚:-)

围棋不像Erlang,这可能就是您要问这个问题的意思.

x := 1
x = 2

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

正如您所注意到的,字符串是不可变的,因此执行字符串操作可能会导致复制.如果您发现想要对字符数据进行就地修改,那么可能需要通过bytes包对[]byte的变量进行操作.

Russ Cox关于这一点的帖子应该可以回答你关于基本数据 struct 的大部分问题:http://research.swtch.com/2009/11/go-data-structures.html

正如其他 comments 者所指出的,你会想看看Go函数的值语义——一开始它们可能有点令人惊讶.

如果您具有以下功能:

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

然后你调用你的代码

myVar.myFunc()

你可能会惊讶地发现这并不是你想要的,因为myFunc()中的t实际上是myVarcopy.

但是,以下will项工作:

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

因为该函数具有pointer的副本,并且可以通过该指针访问底层 struct .

Go相关问答推荐

Go PQ驱动程序无法使用默认架构进行查询

为什么(编码器).EncodeElement忽略";,innerxml";标记?

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

GO框架Echo中间件的使用

";无效的复制因子;融合Kafka Go客户端

关于如何使用 Service Weaver 设置多个不同侦听器的问题

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

用 fork 替换 Go 依赖:...用于两个不同的模块路径

使用Go和Operator SDK通过API调用设置Kubernetes Pods的安装步骤

杜松子wine 和中间件

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

如何使用带有方法的字符串枚举作为通用参数?

如何将文件上传到 Google Drive,并与使用服务帐户和 Golang 的任何人共享

处理程序后访问 HTTP 请求上下文

Golang 工作池实现意外工作

Terraform 自定义提供程序 - 数据源架构

如何使用带有Electron 表格 ID、Electron 表格名称、表格 ID 和值的 golang 在 googlesheet 中插入数据

Golang 'defer' 导致发送(接收)API 响应延迟