为什么说 Go 语言字符串是不可变的?
2023/6/3 1:22:16
本文主要是介绍为什么说 Go 语言字符串是不可变的?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
原文链接: 为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?
这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。
首先来看看它的底层结构:
type stringStruct struct { str unsafe.Pointer len int }
和切片的结构很像,只不过少了一个表示容量的 cap
字段。
-
str
:指向一个[]byte
类型的指针 -
len
:字符串的长度
所以,当我们定义一个字符串:
s := "Hello World"
那么它在内存中存储是这样的:
当我们在程序中对字符串进行重新赋值时,比如这样:
s := "Hello World" s = "Hello AlwaysBeta"
底层的存储就变成了这样:
Go 实际上是重新创建了一个 []byte{}
切片,然后让指针指向了新的地址。
更直接一点,我们直接修改字符串中的单个字符,比如:
s := "Hello World" s[0] = 'h'
这样做的话,会直接报错:
cannot assign to s[0] (strings are immutable)
如果一定要这么做的话,需要对字符串进行一个转换,转换成 []byte
类型,修改之后再转换回 string
类型:
s := "Hello World" sBytes := []byte(s) sBytes[0] = 'h' s = string(sBytes)
这样就可以了。
以上就是本文的全部内容,如果觉得还不错的话欢迎点赞,转发和关注,感谢支持。
推荐阅读:
- Go 语言 map 如何顺序读取?
- Go 语言 map 是并发安全的吗?
- Go 语言切片是如何扩容的?
- Go 语言数组和切片的区别
- Go 语言 new 和 make 关键字的区别
- 为什么 Go 不支持 []T 转换为 []interface
- 为什么 Go 语言 struct 要使用 tags
这篇关于为什么说 Go 语言字符串是不可变的?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-01got an unexpected keyword argument
- 2024-03-30维多利亚的秘密 golang入坑系统
- 2024-03-29mongodb sort by date
- 2024-03-29go swagger
- 2024-03-25mongodb cdc
- 2024-03-25how to use go in vscode
- 2024-03-22mongooseserverselectionerror: connect econnrefused ::1:27017
- 2024-03-21pymongo insert_many
- 2024-03-18projection mongodb
- 2024-03-14clickhouse-go