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

Go中成语的切片拼接吗?

Go中成语的切片拼接吗?

Go
慕森王 2021-05-18 17:13:19
我有以下用于实现接合的代码(即,给定一个字节切片已满,另一个字节切片部分,以及一个表示我想用部分覆盖的完整位置的int pos):package mainimport (    "fmt"    "bytes")func main() {    full := []byte{0,0,0,0,0,0,0}    part := []byte{1,1,1}    newFull1 := splice(full, part, 2)    fmt.Println(newFull1)    // [0 0 1 1 1 0 0]    newFull2 := splice(full, part, 3)    fmt.Println(newFull2)    // [0 0 0 1 1 1 0]}func splice(full []byte, part []byte, pos int) []byte {    return bytes.Join([][]byte{full[:pos], part, full[len(full[:pos])+len(part):]}, []byte{})}基本上,我的方法执行3个字节片的连接:不完整的第一部分不被部分,全部部分覆盖,然后再覆盖完整的其余部分。有没有更好/更惯用的方式来做到这一点?我无法在标准库中找到实现此目的的方法。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

如果您知道部分完全在全部范围之内,则可以使用复制功能。


func main() {

    full := []byte{0, 0, 0, 0, 0, 0, 0}

    part := []byte{1, 1, 1}


    copy(full[2:], part)

    fmt.Println(full)

}


但是,这将完全覆盖。如果要保留原件,可以先使用append函数进行复制。


func main() {

    full := []byte{0, 0, 0, 0, 0, 0, 0}

    part := []byte{1, 1, 1}


    newFull := append([]byte{}, full...)

    copy(newFull[2:], part)

    fmt.Println("newFull:      ", newFull)

    fmt.Println("original full:", full)

}


请注意,这仍然具有原始代码的局限性,即该部分必须适合full的范围。


查看完整回答
反对 回复 2021-05-24
?
大话西游666

TA贡献1817条经验 获得超14个赞

为什么不使用append内置的?


func splice(full, part []byte, pos int) (ret []byte) {

    ret = append(full[:pos], part...)

    return append(ret, full[pos:]...)

}

这可能不是很快(很多复制),但是可读性很强。


查看完整回答
反对 回复 2021-05-24
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

字符串的变体(拆分/拼接/连接)。


func stringSplice(full string, start, deleteCount int, item string) (ret string) {

    if start > len(full) {

        return full + item

    }

    ret = full[:start] + item


    if start+deleteCount > len(full) {

        return ret

    }

    return ret + full[start+deleteCount:]

}


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

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