概述
string rune byte 理解
golang 字符串类型是常用的处理字符串的类型。但是如果是判断len,以及使用处理单个字符的时候就需要使用 rune 或者byte 进行处理。
string 底层存储
数据结构
type stringStruct struct {
array unsafe.Pointer
// 指向一个 [len]byte 的数组
length int
// 长度
}
test := "hello"
p := (*str)(unsafe.Pointer(&test))
fmt.Println(&p, p) // 0xc420070018 &{0xa3f71 5}
c := make([]byte, p.length)
for i := 0; i < p.length; i++ {
tmp := uintptr(unsafe.Pointer(p.array))
// 指针类型转换通过unsafe包
c[i] = *(*byte)(unsafe.Pointer(tmp + uintptr(i))) // 指针运算只能通过uintptr
}
fmt.Println(c)
// [104 101 108 108 111]
fmt.Println(string(c)) // [byte] --> string, "hello"
通过转换为 unsafe.Pointer 转换类型为其相应的类型。一个指针指向相应data 数据,一个是数据长度。
string类型是一个不可变类型,那么任何对string的修改都会新生成一个string的实例,如果是考虑效率的场景就要好好考虑一下如何修改了。
bytes.Buffer
bytes.Buffer 增长buffer时是按照2倍来增长内存,可以有效避免频繁的申请内存。
string.join
这个函数可以一次申请最终string的大小,但是使用得预先准备好所有string,这种场景也是高效的。
strings.Builder
同buffer。
rune
先上代码
var str = "hello 你好"
fmt.Println("len(str):", len(str))
fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
len(str): 12
RuneCountInString: 8
第一个处理的时候返回的应该是string内部的length。统计使用byte 数组作为存储的。string 底层是使用utf-8.压缩的unicode。存储需要14字节。为了满足14字节表示,所以就需要int32 来表示。rune 就是string int32 的表示。可以包含所有的utf-8的编码需求。
在对string 做len 的时候 RuneCountInString 会按照utf-8 的规则统计,所以统计的大小为8.
而len 中,因为中文字符串是3个字节。6 + 3 + 3 = 12
字符转为ascii 编码
直接转为rune 类型, 获取值,就是对应的ascii 对应的值。
value := rune(str[0])
fmt.Printf("%T %d n", value, value)
//int32 104
最后
以上就是听话信封为你收集整理的string rune byte 理解string rune byte 理解的全部内容,希望文章能够帮你解决string rune byte 理解string rune byte 理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复