亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中成語的切片拼接嗎?

Go中成語的切片拼接嗎?

Go
慕森王 2021-05-18 17:13:19
我有以下用于實現接合的代碼(即,給定一個字節切片已滿,另一個字節切片部分,以及一個表示我想用部分覆蓋的完整位置的int pos):package mainimport (    "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個字節片的連接:不完整的第一部分不被部分,全部部分覆蓋,然后再覆蓋完整的其余部分。有沒有更好/更慣用的方式來做到這一點?我無法在標準庫中找到實現此目的的方法。
查看完整描述

3 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

如果您知道部分完全在全部范圍之內,則可以使用復制功能。


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的范圍。


查看完整回答
反對 回復 2021-05-24
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

為什么不使用append內置的?


func splice(full, part []byte, pos int) (ret []byte) {

    ret = append(full[:pos], part...)

    return append(ret, full[pos:]...)

}

這可能不是很快(很多復制),但是可讀性很強。


查看完整回答
反對 回復 2021-05-24
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

字符串的變體(拆分/拼接/連接)。


func stringSplice(full string, start, deleteCount int, item string) (ret string) {

    if start > len(full) {

        return full + item

    }

    ret = full[:start] + item


    if start+deleteCount > len(full) {

        return ret

    }

    return ret + full[start+deleteCount:]

}


查看完整回答
反對 回復 2021-05-24
  • 3 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號