string rune byte 理解

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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值