Go中惯用的切片拼接?
我有以下代码来实现拼接(即,给定一个字节片完整,另一个字节片部分,以及一个表示我要用部分覆盖的完整位置的int-pos):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
基本上,我的方法连接了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可能超出范围。