go string解决下标访问

问题原因

我们首先了解一下go储存string原理.看下面的测试.

s1 := "abc"
s2 := "我是"
fmt.Printf("%T\n", s1)
fmt.Printf("%T\n", s2)

输出:
string
string
没毛病.

然后,重点:

fmt.Println(len(s1))

输出:3 和预期意一样
可是,当我们fmt.Println(len(s2))时,输出"6".
这是为什么?因为go使用字节储存str,为了节省内存

计算机中,数据以bin储存(都知道),然后一个ASCII占用1字节,汉字却占3-4,这就造成只占1字节,2字节的字符也必须跟4字节对齐,造成了内存浪费.下面是我自己做的小例子:
假设’a’储存为0001,'b’为0002,'我’为0003 0004 0005,
如果一般存的话,‘ab我’:
0000 0000 0001 0000 0000 0002 0003 0004 0005
8字节.
go中:
0001 0002 0003 0004 0005
5字节
(很显然,随便敲的,)
这也引来了一个问题,也就是今天的重点.

问题本质

由上面的例子看出,我们想访问"a",一般人会用"str[0]",b则是"str[1]"
但是,访问"我",我们天(傻)真(了)无(吧)邪(唧)地用了"str[2]"
明显,乱码.你想啊,下标为0,取出0001,是a,1,取出0002,也是b,
但下标2,取出0003,只是"我"的一部分(怪怪的)
不乱码是啥
但我们如果"str[2:]".正确.
可是,这仅仅局限于需求最后一个汉字,如果要访问"aabb我在cvcv"中的我,咋整?

解决方案

写个函数吧,

func Index(s string, index uint) string {
	runes := bytes.Runes([]byte(s))
	for i, rune := range runes {
		if i == int(index) {
			return string(rune)
		}
	}
	return ""
}

网上找了好半天才发现的,具体原理大概好像是用bytes包提供的方法,
记得引入bytes包.
传参:Index(要提取的字符串->string, 索引->int).
返回单字,如果索引不存在返回空串.

参考链接.

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dtsroy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值