go - 就地更改函数内的 slice 内容和容量

标签 go slice in-place

我正在努力学习围棋,所以这是我非常简单的函数,用于从 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/

相关文章:

mongodb - 使用 time.Time 字段插入文档时设置默认日期

git - 控制 Go 包版本

python - 在大型一维 NumPy 数组中切片模式

ruby-on-rails - 在 Ruby 中,如果以后不需要散列,使用 hash.merge!({...}) 代替 hash.merge({...}) 会更好吗?

go - 我如何逐元素平方根 gonum 矩阵?

go - 在从 Golang Buffalo 网络应用程序发送推文时设置 CSRF token 时遇到问题

python - 仅反转列表中的整数,无需切片或反向()

python - 如何使用 Python 中的索引列表获取列表切片?

regex - 如何在文件中搜索正则表达式,然后就地修改所有出现的地方?

python - 重复 numpy 操作的预期行为