Go中惯用的切片拼接?

Go中惯用的切片拼接?,go,Go,我有以下代码来实现拼接(即,给定一个字节片完整,另一个字节片部分,以及一个表示我要用部分覆盖的完整位置的int-pos): 基本上,我的方法连接了3个字节的片:full的第一部分没有被part覆盖,all of part,然后是full的剩余部分。有没有更好/更惯用的方法?我在标准库中找不到实现此功能的方法。如果您知道part完全在full的范围内,则可以使用copy函数 func main() { full := []byte{0, 0, 0, 0, 0, 0, 0} part

我有以下代码来实现拼接(即,给定一个字节片完整,另一个字节片部分,以及一个表示我要用部分覆盖的完整位置的int-pos):


基本上,我的方法连接了3个字节的片:full的第一部分没有被part覆盖,all of part,然后是full的剩余部分。有没有更好/更惯用的方法?我在标准库中找不到实现此功能的方法。

如果您知道part完全在full的范围内,则可以使用copy函数

func main() {
    full := []byte{0, 0, 0, 0, 0, 0, 0}
    part := []byte{1, 1, 1}

    copy(full[2:], part)
    fmt.Println(full)
}
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)
}

但这覆盖了全部内容。如果要保留原始文件,可以先使用append函数制作副本

func main() {
    full := []byte{0, 0, 0, 0, 0, 0, 0}
    part := []byte{1, 1, 1}

    copy(full[2:], part)
    fmt.Println(full)
}
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)
}


请注意,这仍然有原始代码的限制,即部分必须符合完整的限制。

为什么不使用内置的
追加功能

func splice(full, part []byte, pos int) (ret []byte) {
    ret = append(full[:pos], part...)
    return append(ret, full[pos:]...)
}
这可能不是很快(大量复制),但可读性很强。

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


我觉得不错。我不认为你会发现一个更简洁的方法就是完成这个。不过,您可能需要添加错误检查。pos可能超出范围。