为了账号安全,请及时绑定邮箱和手机立即绑定

根据golang中的字节长度拆分字符串

根据golang中的字节长度拆分字符串

Go
拉风的咖菲猫 2023-04-04 14:43:54
http 请求头有 4k 的长度限制。我想根据此限制拆分要包含在标题中的字符串。我应该[]byte(str)先使用拆分然后将string([]byte)每个拆分部分转换回字符串吗?有没有更简单的方法来做到这一点?
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

在 Go 中,一个字符串实际上只是一个字节序列,索引一个字符串会产生 bytes。所以你可以简单地将你的字符串分割成 4kB 的子字符串。

但是,由于 UTF-8 字符可以跨越多个字节,因此您可能会在字符序列的中间拆分。如果分割后的字符串总是在解码之前在另一端以相同的顺序再次连接在一起,这不是问题,但是如果您尝试单独解码每个字符串,则可能会得到无效的前导或尾随字节序列。如果你想防止这种情况发生,你可以使用这个unicode/utf8包来检查你是否在一个有效的前导字节上进行拆分,如下所示:

package httputil


import "unicode/utf8"


const maxLen = 4096


func SplitHeader(longString string) []string {

    splits := []string{}


    var l, r int

    for l, r = 0, maxLen; r < len(longString); l, r = r, r+maxLen {

        for !utf8.RuneStart(longString[r]) {

            r--

        }

        splits = append(splits, longString[l:r])

    }

    splits = append(splits, longString[l:])

    return splits

}

直接切片字符串比[]byte来回转换更有效,因为 astring是不可变的而 a[]byte不是,数据必须在转换时复制到新内存,花费 O(n) 时间(双向!),而切片 a string 只是返回一个新的字符串头,由与原始数组相同的数组支持(花费常数时间)。


查看完整回答
1 反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 259 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信