Go中成语的切片拼接吗?

我有以下用于实现接合的代码(即,给定一个字节切片已满,另一个字节切片部分,以及一个表示我想用部分覆盖的完整位置的int pos):


package main


import (

    "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个字节片的连接:不完整的第一部分不被部分,全部部分覆盖,然后再覆盖完整的其余部分。有没有更好/更惯用的方式来做到这一点?我无法在标准库中找到实现此目的的方法。


慕森王
浏览 190回答 3
3回答

慕森卡

如果您知道部分完全在全部范围之内,则可以使用复制功能。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的范围。

大话西游666

为什么不使用append内置的?func splice(full, part []byte, pos int) (ret []byte) {    ret = append(full[:pos], part...)    return append(ret, full[pos:]...)}这可能不是很快(很多复制),但是可读性很强。

芜湖不芜

字符串的变体(拆分/拼接/连接)。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:]}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go