Це трохи дивно бачити, але більшість відповідей тут небезпечні та затьмарюють те, що вони насправді роблять. Переглядаючи оригінальне запитання про видалення предмета зі зрізу, робиться копія зрізу, а потім він заповнюється. Це гарантує, що коли фрагменти передаються навколо вашої програми, ви не вводите тонких помилок.
Ось код, що порівнює відповіді користувачів у цій темі та оригінальний пост. Ось ігровий майданчик, щоб поспішати з цим кодом.
Додайте видалення на основі
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)
}
У наведеному вище прикладі ви бачите, як я створюю зріз і заповнюю його вручну цифрами від 0 до 9. Потім ми видаляємо індекс 5 з усіх і призначаємо його для видалення індексу. Однак, коли ми збираємося роздруковувати все зараз, ми бачимо, що воно також було змінено. Це тому, що зрізи є вказівниками на базовий масив. Списання його на removeIndexпричини, які також allповинні бути модифіковані з різницею, allдовше на один елемент, до якого більше неможливо досягти removeIndex. Далі ми змінюємо значення в, removeIndexі ми бачимо, що воно також allзмінюється. Ефективна детальна деталізація цього питання.
У наступному прикладі я не буду розглядати, але він робить те саме для наших цілей. І лише ілюструє, що використання копії нічим не відрізняється.
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)
}
На запитання оригінальна відповідь
Дивлячись на оригінальне запитання, це не змінює фрагмент, з якого він вилучає елемент. Зробити оригінальну відповідь у цій темі найкращою на сьогодні для більшості людей, які переходять на цю сторінку.
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)
}
Як бачите, цей результат діє так, як очікувало б більшість людей, і, ймовірно, те, чого хоче більшість людей. Модифікація originalRemoveне викликає змін, allа операція видалення індексу та його присвоєння також не спричиняє змін! Фантастично!
Цей код трохи довгий, хоча вищезазначене можна змінити на це.
Правильна відповідь
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)
}
Майже ідентичний оригінальному рішенню індексу видалення, однак ми робимо новий фрагмент, який слід додати до повернення.