1.string结构体底层
由两部分组成:指向底层[ ]byte数组的指针;长度。(类似切片结构体)
2.相同的string常量不会重复存储
//由s1、s2的指针指向一块相同的只读内存,这段内存以utf-8编码存放hello数组
s1 := "hello"
s2 := "hello"
3.string常量会在编译期分配到只读段,对应数据地址不可写入,故string不支持修改。
要修改必须转[]byte,string和[]byte转换,会将这段只读内存的数据复制到堆/栈上。
//wrong
s := "hello"
s[0] = 'A'
//right
s := "hello"
a := []byte(s)
a[0] = 'H'
s = string(a) //s="Hello"
package main
import "fmt"
/go的本质是值拷贝,但string底层是指针
/故 函数参数变量s也是一段新地址,但是底层指针指向的地址与main中s相同,为存储数据的空间
func change(s string) string {
fmt.Printf("%#v\n", &s)
a := []byte(s)
a[0] = 's'
return string(a)
}
func main() {
s := "abcd"
fmt.Printf("%#v\n", &s)
s2 := change(s)
fmt.Printf("%#v\n", &s2)
}
整体反转可以整体转为[]byte,不能把string类型作为参数直接传进来
Q:那怎么在原字符串上进行 部分反转?
输入: “abcd”
输出:“acbd”
部分反转错误解法,change返回的是“cb”,而不是“acbd”
func main() {
s := "abcd"
s = change(s[1:3])
fmt.Println(s)
}
func change(s string) string {
a := []byte(s)
i := 0
j := len(a)-1
for i < j {
a[i],a[j] = a[j],a[i]
}
return string(a)
}
反转正确解法
1.
func main() {
s := "abcd"
a := []byte(s)