Bunu görmek biraz tuhaf ama buradaki cevapların çoğu tehlikelidir ve gerçekte ne yaptıklarıyla ilgilidir. Bir öğenin dilimden çıkarılmasıyla ilgili sorulan orijinal soruya bakıldığında, dilimin bir kopyası yapılıyor ve sonra dolduruluyor. Bu, dilimler programınızın etrafında dolaşırken ince hatalar oluşturmamanızı sağlar.
İşte bu konudaki ve orijinal gönderideki kullanıcıların cevaplarını karşılaştıran bazı kodlar. İşte bu kodla uğraşmak için bir oyun alanı .
Eklemeye dayalı kaldırma
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
Yukarıdaki örnekte benim bir dilim oluşturduğumu ve onu manuel olarak 0'dan 9'a kadar sayılarla doldurduğumu görebilirsiniz. Daha sonra indeks 5'i tümünden kaldırıp indeksi kaldırmak için atıyoruz. Ancak şimdi hepsini yazdırmaya gittiğimizde, onun da değiştirildiğini görüyoruz. Bunun nedeni, dilimlerin temeldeki bir diziye işaretçiler olmasıdır. Bunu, değiştirilecek removeIndex
nedenlere yazmak all
, fark varlığıyla birlikte, all
artık erişilemeyen bir öğe tarafından artık removeIndex
. Sonra içindeki bir değeri değiştiririz removeIndex
ve all
değiştirildiğini de görebiliriz . Etkili geçiş bu konuda biraz daha ayrıntıya giriyor.
Aşağıdaki örneğe girmeyeceğim ama aynı şeyi bizim amaçlarımız için yapıyor. Ve sadece kopya kullanmanın farklı olmadığını gösteriyor.
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
Soruların orijinal cevabı
Orijinal soruya bakıldığında, bir öğeyi kaldırdığı dilimi değiştirmez. Bu başlıktaki orijinal yanıtı, bu sayfaya gelen çoğu insan için şimdiye kadarki en iyi yapmak.
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
Gördüğünüz gibi, bu çıktı çoğu insanın beklediği ve çoğu insanın istediği gibi davranıyor. 'Nin originalRemove
değiştirilmesi, içinde değişikliklere neden olmaz all
ve dizinin kaldırılması ve atanması da değişikliklere neden olmaz! Fantastik!
Bu kod biraz uzun olsa da, yukarıdakiler buna değiştirilebilir.
Doğru cevap
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
Orijinal kaldırma indeksi çözümüyle neredeyse aynı, ancak geri dönmeden önce eklenecek yeni bir dilim oluşturuyoruz.