Go string []byte总结

Go 专栏收录该内容
1 篇文章 0 订阅
  • Go语言的string和C++的string有比较大的区别。go中的string是一个字符串常量,不能直接修改其中的元素,而c++中string可以直接修改其内部元素的值。

C++

std::string s = "123";
s[0] = 2;
std::cout << s << "\n";
//输出结果 223  

GO

s := "123";
s[0] = '2';
//则会直接报错

Go中string []byte的底层结构

# string
type StringHeader struct {
	Data uintptr
	Len  int
}

# []byte
type SliceHeader struct {
	Data uintptr
	Len  int
	Cap  int
}
  • 当我们累加string的时候,go会创建一块新的空间,然后将累加的值拷贝过去。这样就导致每一次对string进行+操作时都会生成新的空间然后复制造成性能低下。
    为什么go中string的操作每次要申请新的空间?
  • 因为字符串作为只读的类型,我们并不会直接向字符串直接追加元素改变其本身的内存空间,所有在字符串上的写入操作都是通过拷贝实现的。

解决:

  • 我们可以用byte来进行操作,然后将结果转换成string就可以。因为每次都byte进行写入到时候,会申请两倍的空间来进行操作。

string 和 []byte 的一些坑点总结:

	s := "你好"
	for _, i := range s {
		fmt.Println(i)
	}


	b := []byte(s)
	for _, i := range b {
		fmt.Println(i)
	}
  • 输出结果会发现打印的完全不通。

原因:
在range string时,i为rune类型,utf8编码类型。而range []byte类型时则为byte类型,导致打印结果不同。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页

打赏作者

For_zwb

竟然可以打赏了

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值