Удалить элемент в срезе и вернуть удаленный и оставшийся - PullRequest
0 голосов
/ 12 сентября 2018

Мне просто нужна функция, которая, имеющая фрагмент структуры типа "t", возвращает возвращаемый элемент, который я ищу, и оставшиеся, я пробовала с частичным решением моей проблемы, как указано здесь: Удалить элемент в срезе Но по странной причине он не работает должным образом https://play.golang.org/p/tvJwkF5c_tj

    func main() {
    var names = []string{"john", "julio", "pepito","carlos"}
    fmt.Println(getMe("john", names))
}
func getMe(me string, names []string) (string, []string, bool) {
    for i := range names {
        if names[i] == me {
            return names[i], append(names[:i], names[i+1:]...), true
        }
    }
    return "", nil, false
}

, но результат дает мне:

julio [julio pepito carlos] true

ОБНОВЛЕНИЕ:https://play.golang.org/p/1xbu01rOiMg Получение ответа от @Ullaakut Если я сделаю: append(names[:i], names[i+1:]...), это изменит исходный срез, так что это не работает для меня, я не хочу, чтобы мой срез изменился, потому что я буду использовать его позжена

1 Ответ

0 голосов
/ 12 сентября 2018

Просто используйте диапазон для получения значения и индекса, а не для доступа к значению с помощью индекса.

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]

См. пример игровой площадки

Редактирование после запроса на более быструю версию: использование руководства вместо цикла диапазона намного быстрее.Поскольку вам нужно создать новый срез без элемента, необходимо создать новый срез внутри функции, которая всегда потребует некоторой вычислительной мощности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...