我有以下用于实现拼接的代码(即,给定一个字节片满,另一个字节片部分,以及一个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{})
}
Run Code Online (Sandbox Code Playgroud)
基本上,我的方法执行3个字节切片的连接:完全的第一部分,不会被部分覆盖,全部部分,然后是完整的剩余部分.这样做有更好/更惯用的方法吗?我无法在标准库中找到实现此方法的方法.
如果您知道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)
}
Run Code Online (Sandbox Code Playgroud)
虽然覆盖了很多.如果要保留原始文件,可以先使用追加功能制作副本.
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)
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仍然具有原始代码的限制,该部分必须符合full的范围.