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

在Google Go中,我读到Strings是不可改变的,但是它是int的?
其他类型怎么办?作为一个稍微老一些的程序员,我喜欢可变性,即使我知道不变性的好处,我更喜欢生活危险.

知道什么类型是可变的或不可变的将是非常有益的.

更新,我最关心的是根据类型是可变的或不可变的实际问题.如Java中的典型示例,如果您在循环中创建一个String并循环10,000次,那么将创建10,000个String,然后再被垃圾回收.这实际上是我在一家公司工作的一个项目中的一个严重问题.

问题是,Go的不变性在某些情况下是否也产生同样的问题?

它会影响你应该如何处理var. (或我假设它).

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

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

不要担心 – 如果你真的想要,你可以让你自己在脚上射击:-)

去不是像Erlang,这可能是你正在得到的问题.

x := 1
x = 2

分配一个值为1的变量x,然后将其重新分配为2 – 此处不分配其他内存.

正如你所说,字符串是不可变的,所以进行字符串操作可以导致拷贝.如果您发现要对字符数据进行就地修改,则可能需要通过字节包操作[]字节的变量.

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的副本.

但是,以下内容将会起作用:

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

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

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/8018081/which-types-are-mutable-and-immutable-in-the-google-go-language

转载注明原文:Google Go语言中哪些类型是可变的和不可变的?