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

时间:2018-09-11 21:22:07

标签: go

我只想要一个具有结构类型“ t”的切片的函数,返回返回我要查找的元素以及剩余的元素,我尝试使用部分解决方案来解决我的问题,如下所示: Delete element in a slice 但是出于一个奇怪的原因,它没有按预期工作 https://play.golang.org/p/tvJwkF5c_tj

ReactDOM.render(
  <div
    style={{
        position: 'absolute', left: '50%', top: '50%',
        transform: 'translate(-50%, -50%)'
    }}
    >
    Hello, world!
  </div>,
  document.getElementById('root')
);

但结果给了我

    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
}

更新: https://play.golang.org/p/1xbu01rOiMg 从@Ullaakut获得答案 如果执行以下操作:julio [julio pepito carlos] true ,它将更改原始切片,因此这对我不起作用,我不希望更改切片,因为稍后将在

上使用它。

1 个答案:

答案 0 :(得分:2)

只需使用范围即可获取值和索引,而不是通过使用索引来访问值。

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]

请参见playground example

在请求更快版本后进行编辑:使用代替代替范围循环的手册要快得多。由于您需要创建一个没有元素的新切片,因此有必要在函数内构建一个新切片,这总是需要一定的处理能力。