当我尝试循环切片并删除序列中的每个元素以打印剩余元素时,我会得到一些意想不到的行为,使用SliceTricks中建议的Delete方法.例如,当我尝试通过包含字母a片环,我希望可以将输出为,,的顺序:[A B C][B C][A C][A B]
方法1
package main
import "fmt"
func main() {
a := []string {"A", "B", "C"}
for i, _ := range a {
fmt.Println(append(a[:i], a[i+1:]...))
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这里的输出对我来说是令人惊讶的.它输出[B C]三次.
通过执行以下操作,我最终得到了我预期的行为:
方法2
package main
import "fmt"
func main() {
a := []string {"A", "B", "C"}
for i, _ := range a {
result := make([]string, 0)
result = append(result, a[:i]...)
result = append(result, a[i+1:]...)
fmt.Println(result)
}
}
Run Code Online (Sandbox Code Playgroud)
是什么导致了方法1中的意外行为,除了方法2之外还有更好的方法来实现吗?
如果您想在没有额外分配的情况下执行此操作,请尝试仅交换值,如下例所示:
请注意,这假设您可以随机播放列表内容.如果没有,只需在循环之前复制一次列表,并执行与下面相同的操作.
package main
import "fmt"
func main() {
set := []string{"a", "b", "c"}
for i := range set {
set[0], set[i] = set[i], set[0]
fmt.Println(set[1:])
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[b c]
[a c]
[a b]
Run Code Online (Sandbox Code Playgroud)