2012-11-24 38 views
4

我有用於實現拼接下面的代碼(即,給定一個字節切片滿,另一個字節切片部分,以及表示在充滿了我想和部分覆蓋該位置的int POS):Go中的地道切片拼接?

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字節切片的連接:完整的第一部分不會被部分,全部部分,然後剩餘部分完全覆蓋。有沒有更好的/更習慣性的做法?我無法找到在標準庫中實現此功能的方法。

+1

看起來不錯。我認爲你不會找到一個更簡潔的方法來完成這個任務。儘管你可能想要添加錯誤檢查。 pos可能會超出界限。 – Daniel

回答

6

如果您知道部分完全位於完整範圍內,則可以使用複製功能。

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

    copy(full[2:], part) 
    fmt.Println(full) 
} 

playground

這將覆蓋全雖然。如果您想保留原稿,可以先使用追加功能製作副本。

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) 
} 

注意,這仍然有原來的代碼部分必須滿足的充分的範圍內的限制。

+0

完美,謝謝! – v64

0

爲什麼不使用內置的append

func splice(full, part []byte, pos int) (ret []byte) { 
    ret = append(full[:pos], part...) 
    return append(ret, full[pos:]...) 
} 

這可能不是很快(大量複製),但它非常易讀。