在 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(使用前将#替换为@)