Просто используйте диапазон для получения значения и индекса, а не для доступа к значению с помощью индекса.
package main
import (
"fmt"
)
func main() {
var names = []string{"john", "julio", "pepito", "carlos"}
name, newNames, _ := getMe("john", names)
fmt.Println("extracted name:\t\t\t\t", name)
fmt.Println("new slice without extracted name:\t", newNames)
fmt.Println("old slice still intact:\t\t\t", names)
}
func getMe(me string, names []string) (string, []string, bool) {
var newSlice []string
for i := 0; i < len(names); i++ {
if names[i] == me {
newSlice = append(newSlice, names[:i]...)
newSlice = append(newSlice, names[i+1:]...)
return names[i], newSlice, true
}
}
return "", nil, false
}
Выходы
extracted name: john
new slice without extracted name: [julio pepito carlos]
old slice still intact: [john julio pepito carlos]
См. пример игровой площадки
Редактирование после запроса на более быструю версию: использование руководства вместо цикла диапазона намного быстрее.Поскольку вам нужно создать новый срез без элемента, необходимо создать новый срез внутри функции, которая всегда потребует некоторой вычислительной мощности.