Golang中字符串类型并非不可变,第二次赋值后值被保留
Golang中字符串类型并非不可变,第二次赋值后值被保留 Go语言的字符串是不可变的;我有以下代码,在包作用域级别对字符串进行了赋值,但在块级别重新赋值时,它却毫无错误或问题地接受了;并且第三次重新赋值时,它也没有出现任何问题/错误。我是不是遗漏了什么!
package main
import "fmt"
var str11 string ="hello" //???
func main() {
str11="Hello, Go lang, Subbareddy jangalapalli"
fmt.Println(str11)
str11="Hello string is immutable, can't change" //cant change or error; it should holds first value
fmt.Println(str11)
bs:=[]byte(str11)
fmt.Println("UTF-8:\n",bs)
fmt.Printf("%T\n",bs)
fmt.Println("CHAR\tUTF-8\tBINARY\tOCTAL\tHEX")
for i:=0; i<len(str11); i++{
fmt.Printf("%c\t%v\t\t%b\t%o\t%#x\n",str11[i],str11[i],str11[i],str11[i],str11[i])
}
}
更多关于Golang中字符串类型并非不可变,第二次赋值后值被保留的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
重新赋值并非修改。
字符串本身并未被触及或改变,改变的只是变量所指向的位置。
在Go语言中,字符串的不可变性是指字符串值本身不可修改,而不是变量不可重新赋值。你的代码演示的是变量重新赋值,而不是修改现有字符串的内容。以下是关键点说明:
- 字符串不可变性:字符串在内存中的字节序列不可更改。任何修改操作都会创建新的字符串。
- 变量重新赋值:变量
str11可以指向不同的字符串值,这是完全合法的。
示例代码说明:
package main
import "fmt"
func main() {
// 原始字符串
s := "hello"
fmt.Printf("原始字符串地址: %p\n", &s)
fmt.Println("原始字符串:", s)
// 尝试修改字符串中的字符(编译错误)
// s[0] = 'H' // 错误: cannot assign to s[0]
// 重新赋值变量(合法)
s = "Hello, Go"
fmt.Printf("重新赋值后地址: %p\n", &s)
fmt.Println("重新赋值后:", s)
// 证明字符串值不可变
s1 := "hello"
s2 := s1
fmt.Printf("s1: %p, s2: %p\n", &s1, &s2)
// 修改操作创建新字符串
s3 := s1 + " world"
fmt.Printf("s1: %p, s3: %p\n", &s1, &s3)
}
输出:
原始字符串地址: 0xc000010250
原始字符串: hello
重新赋值后地址: 0xc000010250
重新赋值后: Hello, Go
s1: 0xc0000102a0, s2: 0xc0000102b0
s1: 0xc0000102a0, s3: 0xc0000102c0
注意:
- 变量地址不变,但指向的字符串值已改变
- 字符串拼接等操作会创建新字符串
- 无法直接修改字符串中的字节
你的代码中str11变量被多次重新赋值,这符合Go语言规范。字符串不可变性体现在无法直接修改字符串内容,例如str11[0] = 'H'会导致编译错误。

