参考文章:https://www.jianshu.com/p/448451663cf3
字符串常量转切片
对字符串常量转换的切片长度和容量都等于原字符串长度
func main() {
// str := "test string"
sli := []byte("test string")
fmt.Printf("%s %d %d\n", sli, len(sli), cap(sli)) // test string 11 11
}
字符串变量转切片
- 如果切片没有发生变量逃逸且字符串长度小于等于32,生成的切片容量为32
func main() {
str := "test string"
sli := []byte(str)
fmt.Printf("%d %d\n", len(sli), cap(sli)) // 11 32
}
- 如果切片发生变量逃逸或字符串长度大于32,根据字符串长度,生成的容量不同,容量值从
runtime/sizeclasses.go
文件中的class_to_size
中取值:0, 8, 16, 32, 48, 64, 80, 96, 112, 128...
func main() {
str := "test string"
sli := []byte(str)
fmt.Printf("%s %d %d\n", sli, len(sli), cap(sli)) // test string 11 16
}
func main() {
str := "test"
sli := []byte(str)
fmt.Printf("%s %d %d\n", sli, len(sli), cap(sli)) // test 4 8
}