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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從 Golang 中的切片中刪除

從 Golang 中的切片中刪除

Go
精慕HU 2023-06-19 17:46:05
我有以下測(cè)試打印原始輸入切片(過濾后),沒有已刪除的元素,但最后有一個(gè)額外的元素使輸入切片具有相同的長(zhǎng)度,即使過濾后它應(yīng)該是更短。我怎樣才能避免有一個(gè)“輸出切片”?(以正確的方式打印,包含正確的元素,具有預(yù)期的長(zhǎng)度和容量)為什么我嘗試“刪除就地”導(dǎo)致“輸入切片”的長(zhǎng)度與過濾過程之前的長(zhǎng)度相同?為什么“輸入切片”的長(zhǎng)度與我應(yīng)用過濾過程之前的長(zhǎng)度相同?如何進(jìn)行刪除操作以更改“輸入切片”的長(zhǎng)度?這是代碼:這是測(cè)試執(zhí)行的輸出:$ go test -v -run TestFoo=== RUN? ?TestFooOriginal (PRE) slice[{1 FooCat 6.046602879796196} {2 FooCat 9.405090880450125} {3 FooCat 6.645600532184904}]342019/05/31 12:53:30 Loop ID 0Original (POST) slice[{2 FooCat 9.405090880450125} {3 FooCat 6.645600532184904} {3 FooCat 6.645600532184904}]34Filtered element{1 FooCat 6.046602879796196}Output slice[{2 FooCat 9.405090880450125} {3 FooCat 6.645600532184904}]24--- PASS: TestFoo (0.00s)PASSok? ? ? git.openenergi.net/scm/flex/service/common? 0.008s更新“作為指針的輸入切片”好的,假設(shè)我想處理原始輸入切片,即沒有副本或輸出切片。為什么以下代碼在注釋的代碼行中引發(fā)運(yùn)行時(shí)恐慌?(?pointedInSl[inLen-1] = FooItem{})為什么打印的切片(應(yīng)用函數(shù)后)在其末尾包含 2 個(gè)相同的項(xiàng)目?如何刪除最后一個(gè)冗余元素?為什么應(yīng)用函數(shù)后切片的長(zhǎng)度仍然與應(yīng)用函數(shù)前的切片長(zhǎng)度相同?如何使原始切片縮小 1(即輸出長(zhǎng)度 = 原始長(zhǎng)度 - 1)?
查看完整描述

2 回答

?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

當(dāng)你有一個(gè)int類型的變量時(shí),你想寫一個(gè)函數(shù)來(lái)遞增它的值,你該怎么做?您要么將指針傳遞給變量,要么返回必須分配給原始變量的增量值。

例如(在Go Playground上試試):

func inc(i int) int { i++; return i }


var i int = 2

inc(i)

fmt.Println(i) // This will be 2

在上面的代碼中,您將i其inc()遞增并返回其值。原件i當(dāng)然不會(huì)變,i里面inc()只是一個(gè)副本,獨(dú)立于原件i。要更改原件,您必須評(píng)估返回值:


i = inc(i)

或者首先使用指針(在Go Playground上嘗試):


func inc(i *int) { *i++ }


var i int = 2

inc(&i)

fmt.Println(i) // This will be 3

切片也是如此。如果您想要/必須修改切片標(biāo)頭(這是一個(gè)數(shù)據(jù)指針、長(zhǎng)度和容量,請(qǐng)參閱參考資料reflect.SliceHeader),您要么必須將指針傳遞給該切片(不是很常見),要么必須返回修改后的新切片您必須在呼叫者處分配的標(biāo)頭。這是更常用的解決方案,這也是內(nèi)置函數(shù)遵循的方法append()

當(dāng)您切片時(shí),(例如someslice[min:max]),新切片將與原始切片共享支持?jǐn)?shù)組。這意味著如果您修改新切片的元素,原始切片也會(huì)觀察到這些更改。因此,如果您從新切片中刪除一個(gè)元素并將元素復(fù)制到被刪除元素的位置,則原始切片的最后一個(gè)元素仍將在那里,它被原始切片“覆蓋”。通常的做法是將最后一個(gè)元素置零,以便垃圾收集器可以回收它的內(nèi)存,如果它是指針類型(或“類似”如切片、映射或通道)。

  • 我怎樣才能避免有一個(gè)“輸出切片”?(以正確的方式打印,包含正確的元素,具有預(yù)期的長(zhǎng)度和容量)

正如這個(gè)答案中所述:您必須將一個(gè)指針傳遞給您的切片,并修改 中的指向值FindAndRemoveFromFooSlice(),因此您不必返回新切片。

  • 為什么我嘗試“刪除就地”導(dǎo)致“輸入切片”的長(zhǎng)度與過濾過程之前的長(zhǎng)度相同?

你從來(lái)沒有修改過原始切片,你傳遞了它所以制作了一個(gè)副本,并且在內(nèi)部FindAndRemoveFromFooSlice()你只能修改副本(但你甚至沒有修改副本)。你返回一個(gè)新的切片,但你沒有分配它,所以原來(lái)的切片(頭)是完整的。

  • 為什么“輸入切片”的長(zhǎng)度與我應(yīng)用過濾過程之前的長(zhǎng)度相同?如何進(jìn)行刪除操作以更改“輸入切片”的長(zhǎng)度?

前兩個(gè)問題回答了這個(gè)問題。


查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

最小工作代碼示例(帶有注釋以提供一些上下文):


// use a pointer for the input slice so then it is changed in-place

func FindAndRemoveFromFooSliceInPlace(iFilter int, inSl *[]FooItem) *FooItem {

? ? pointedInSl := *inSl // dereference the pointer so then we can use `append`

? ? inLen := len(pointedInSl)

? ? for idx, elem := range pointedInSl {

? ? ? ? if elem.Id == iFilter {

? ? ? ? ? ? log.Printf("Loop ID %v", idx)


? ? ? ? ? ? // check these docs: https://github.com/golang/go/wiki/SliceTricks#delete

? ? ? ? ? ? pointedInSl = append(pointedInSl[:idx], pointedInSl[idx+1:inLen]...)

? ? ? ? ? ? pointedInSl = pointedInSl[:inLen-1]

? ? ? ? ? ? *inSl = pointedInSl // assigning the new slice to the pointed value before returning


? ? ? ? ? ? return &elem

? ? ? ? }

? ? }

? ? return nil

}


查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 2 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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