gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:00:24 28 4
gpt4 key购买 nike

在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com