我有以下用于实现拼接的代码(即,给定一个字节片已满,另一个字节片部,以及一个表示要用部分覆盖的完整位置的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个字节片的连接:不完整的第一部分不被部分,全部部分覆盖,然后覆盖剩余的完整部分。有没有更好/更惯用的方法?我无法在标准库中找到实现此目的的方法。
如果您知道部分完全在全部范围之内,则可以使用复制功能。
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的范围。