第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

刪除切片中的每個元素

刪除切片中的每個元素

Go
紅糖糍粑 2021-09-27 14:13:08
當(dāng)我嘗試使用SliceTricks 中建議的Delete方法遍歷切片并按順序刪除每個元素以打印剩余元素時,出現(xiàn)了一些意外行為。例如,當(dāng)我嘗試遍歷包含字母的切片時[A B C],我希望輸出為[B C], [A C],[A B]按以下順序:方法一package mainimport "fmt"func main() {    a := []string {"A", "B", "C"}    for i, _ := range a {        fmt.Println(append(a[:i], a[i+1:]...))    }}然而,這里的輸出讓我感到驚訝。它輸出[B C]三倍。通過執(zhí)行以下操作,我最終確實得到了預(yù)期的行為:方法二package mainimport "fmt"func main() {    a := []string {"A", "B", "C"}    for i, _ := range a {        result := make([]string, 0)        result = append(result, a[:i]...)        result = append(result, a[i+1:]...)        fmt.Println(result)    }}是什么導(dǎo)致了方法 1 中的意外行為,除了方法 2 之外,還有沒有更好的方法來實現(xiàn)這一點?
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

“什么”是因為append(slice, elems...)實際上是slice用新元素更新。它僅返回一個“新”切片,因為它可能由于內(nèi)存重新分配而不得不重新定位原始切片。因此,在您的示例代碼中,您實際上是a在每次調(diào)用append. (此golang 博客文章的“附加:示例”部分中有一個很好的概述)。


至于“如何”,我的嘗試是:


package main


import "fmt"


func main() {

    a := []string {"A", "B", "C"}

    for i, _ := range a {

        result := make([]string, i, len(a)-1)

        copy(result, a[:i])

        result = append(result, a[i+1:]...)

        fmt.Println(result)

    }

}


使用result長度和容量進行初始化,以及使用copy而不是兩個appends 嘗試減少所需的內(nèi)存重新分配次數(shù)。


查看完整回答
反對 回復(fù) 2021-09-27
  • 3 回答
  • 0 關(guān)注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號