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 回复

明白了,谢谢

更多关于Golang中字符串类型并非不可变,第二次赋值后值被保留的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


重新赋值并非修改。

字符串本身并未被触及或改变,改变的只是变量所指向的位置。

在Go语言中,字符串的不可变性是指字符串值本身不可修改,而不是变量不可重新赋值。你的代码演示的是变量重新赋值,而不是修改现有字符串的内容。以下是关键点说明:

  1. 字符串不可变性:字符串在内存中的字节序列不可更改。任何修改操作都会创建新的字符串。
  2. 变量重新赋值:变量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'会导致编译错误。

回到顶部