删除切片中的元素,然后返回删除的元素和剩余的元素

I just want a function that having a slice of a struct type "t", returns the returns the element I'm looking for and the remaining, I tried with the partial solution for my problem like pointed out here: Delete element in a slice But for a weird reason, it does not work as expected 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
}

but the result gives me:

julio [julio pepito carlos] true

UPDATE: https://play.golang.org/p/1xbu01rOiMg Taking the answer from @Ullaakut If I do: append(names[:i], names[i+1:]...), it changes the original slice, so this does not work for me, I do not want my slice to change, because I will be using it later on

Simply use the range to get both the value and the index, instead of accessing the value by using the index.

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
}

Outputs

extracted name:                        john
new slice without extracted name:      [julio pepito carlos]
old slice still intact:                [john julio pepito carlos]

See playground example

Edit after request for a faster version: Using the manual for instead of the range loop is much faster. Since you need to create a new slice without the element, it's necessary to build a new slice within the function, which is always going to take some processing power.