本文介绍了在Google Go语言中,哪些类型是可变的,哪些是不可变的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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


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

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

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


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

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

推荐答案

别担心--Go会让你开枪打自己的脚,如果你真的想的话:-)

Go不像Erlang,而Erlang可能就是您要问的问题。

x := 1
x = 2
分配一个值为1的变量x,然后将其重新分配给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副本

但是,以下起作用:

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

因为该函数具有指针的副本,并且可以通过该指针访问基础结构。

这篇关于在Google Go语言中,哪些类型是可变的,哪些是不可变的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 16:35