我只想要一个具有结构类型“ 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
,它将更改原始切片,因此这对我不起作用,我不希望更改切片,因为稍后将在
答案 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]
在请求更快版本后进行编辑:使用代替代替范围循环的手册要快得多。由于您需要创建一个没有元素的新切片,因此有必要在函数内构建一个新切片,这总是需要一定的处理能力。