我正在努力学习围棋,所以这是我非常简单的函数,用于从 slice 中删除相邻的重复项以供 Donovan 和 Kernighan 的书中的练习使用。
这是代码:https://play.golang.org/p/avHc1ixfck
package main
import "fmt"
func main() {
a := []int{0, 1, 1, 3, 3, 3}
removeDup(a)
fmt.Println(a)
}
func removeDup(s []int) {
n := len(s)
tmp := make([]int, 0, n)
tmp = append(tmp, s[0])
j := 1
for i := 1; i < n; i++ {
if s[i] != s[i-1] {
tmp = append(tmp, s[i])
j++
}
}
s = s[:len(tmp)]
copy(s, tmp)
}
它应该打印出 [0 1 3]
- 我检查过,实际上 tmp
在函数的末尾它具有所需的形式。但是,结果是 [0 1 3 3 3 3]
。我想有一些东西具有 copy
功能。
我能否以某种方式将输入 slice s
替换为 temp
或将其修剪为所需的长度?
最佳答案
选项 1
按照@zerkms 的建议返回一个新 slice 。
https://play.golang.org/p/uGJiD3WApS
package main
import "fmt"
func main() {
a := []int{0, 1, 1, 3, 3, 3}
a = removeDup(a)
fmt.Println(a)
}
func removeDup(s []int) []int {
n := len(s)
tmp := make([]int, 0, n)
tmp = append(tmp, s[0])
for i := 1; i < n; i++ {
if s[i] != s[i-1] {
tmp = append(tmp, s[i])
}
}
return tmp
}
选项 2
使用指针传递引用。
与选项 1 的效果相同。
https://play.golang.org/p/80bE5Qkuuj
package main
import "fmt"
func main() {
a := []int{0, 1, 1, 3, 3, 3}
removeDup(&a)
fmt.Println(a)
}
func removeDup(sp *[]int) {
s := *sp
n := len(s)
tmp := make([]int, 0, n)
tmp = append(tmp, s[0])
for i := 1; i < n; i++ {
if s[i] != s[i-1] {
tmp = append(tmp, s[i])
}
}
*sp = tmp
}
另请参阅以下 SO 线程: Does Go have no real way to shrink a slice? Is that an issue?
关于go - 就地更改函数内的 slice 内容和容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269506/