程序员面试合集第一篇
为什么说Go中的字符串不能修改
字符串定义
package main
import "fmt"
func main() {
var str string = "Hello World!"
}
在Go中,字符串通常有三种定义方式:
// 第一种(全量定义)
var 变量名称 string = "字符串内容"
// 类型推导
var 变量名称 = "字符串内容"
// 短标记(只适用于局部变量)
变量名称 := "字符串内容"
字符串的定义,其实也可以通过字节的方式。这里罗列的方式是最为常见的方式。
字符串的组成
s := "Hello World!"
for _, v := range s {
fmt.Print(v)
fmt.Print("\t")
}
// 72 101 108 108 111 32 87 111 114 108 100 33
上面代码打印的内容,就是每一个字符所表示的字节码。
字符串不能修改
str := "Hello World!"
// 重新赋值
str = "Hello Go!"
// 字符串修改
str[0] = "I"
通常听到的不能修改,其实就是指的上面代码的第二种方式。并且通过这种方式修改会报错::cannot assign to s[0] (value of type byte)
Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值
。Go中源码有这样一段定义:type stringStruct struct {
str unsafe.Pointer // 指向一个byte类型的切片指针
len int // 字符串的长度
}
fmt.Println(s[0]) // output:72
package main
import (
"fmt"
)
func main() {
s1 := []byte{72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}
fmt.Println(string(s1))
// 将"H"修改为l
s1[0] = 108
fmt.Println(string(s1))
}
// output:
Hello World!
lello World!
字符串的赋值
package main
import (
"fmt"
)
func main() {
// 声明一个字符串,并给与初始值
s := "Hello World!"
// 对变量 s 进行重新赋值
s := "Hello Go!"
}
Hello Go!
)。原有的Hello World!
内存空间会随着垃圾回收机制被回收掉。为什么这么设计
评论