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

标签 go immutability mutability

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

知道哪些类型是可变的或不可变的会很有帮助。


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

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

它会影响您应该如何对待 var。 (或者我认为确实如此)。


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

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

最佳答案

别担心——如果你真的想,Go 会让你在脚下开枪:-)

Go 与 Erlang 不同,这可能是您遇到的问题。

x := 1
x = 2

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

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

Russ Cox 关于这个的帖子应该可以回答您关于基本数据结构的大部分问题: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()

您可能会惊讶地发现这并没有达到您想要的效果,因为在 myFunc() 中看到的 t 实际上是一个副本<myVar 的/em>。

但是,以下起作用:

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

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

关于go - Google Go 语言中哪些类型是可变的和不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8018081/

相关文章:

c# - 不可变类和统一应用程序 block

c# - 处理函数代码中可变性的策略

python - 可变常量安全吗?

object - 在 Rust(0.5 和/或 trunk)中,如何创建可变对象的可变向量?

go - goroutines到底是什么?

go - redigo 连接池 - 为什么在删除陈旧连接时释放锁

groovy - 在 Groovy 中使对象不可变

rest - 在参数中添加数组时 HTTP GET 失败,但使用 postman 会成功

go - 如何在无服务器 lambda 数据源中捕获 AWS AppSync 事件

python - 类重复输入对象