arrays - 函数是否可以更改在其他地方声明的字符串数组 slice 的大小?戈兰

标签 arrays go pass-by-reference slice

我想从 slice 中就地删除一个元素。但是当我这样做时,我最终会在底层数组中生成两个空元素。 我已经搜索过here , here

package main

import "fmt"

//String remove adjacent duplicates from a string array
func rmDup(str []string) []string {
    for i := 1; i < len(str); i++ {
        if str[i] == str[i-1] {
            copy(str[i:], str[i+1:])
            str[len(str)-1] = ""
            str = str[:len(str)-1]
        }
    }
    return str
}

func main() {

    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", "zebra"}

    fmt.Println(str)
    newstr := rmDup(str)
    fmt.Println(str)
    fmt.Println(newstr)
    fmt.Println(len(str), cap(str), "final")
    fmt.Println(len(newstr), cap(newstr), "final")
}

有什么方法可以让main中的str返回rmDup()中定义的sizecapacity

最佳答案

事实证明,我自己找到了答案。由于 Go 语言按值执行函数调用,因此无法更改在另一个作用域中声明的 slice ,除非使用指针。

package main

import "fmt"

//String remove adjacent duplicates from a string array
func rmDup(str *[]string) []string {
 var s = *str
 for i := 1; i < len(s); i++ {
    if s[i] == s[i-1] {
        copy(s[i:], s[i+1:])
        s[len(s)-1] = ""
        s = s[:len(s)-1]
    }
}
*str = s
return s
}

func main() {

  str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", 
  "zebra"}

  fmt.Println(str)
  newstr := rmDup(&str)
  fmt.Println(str)
  fmt.Println(newstr)
  fmt.Println(len(str), cap(str), "final")
  fmt.Println(len(newstr), cap(newstr), "final")
}

输出:

[dog cat cat mouse mouse zebra zebra]
[dog cat mouse zebra]
[dog cat mouse zebra]
4 7 final
4 7 final

关于arrays - 函数是否可以更改在其他地方声明的字符串数组 slice 的大小?戈兰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43018862/

相关文章:

javascript - 数组的内部*当前值*

php - 如何获取数组中最长字符串的长度

go - 当永远不会评估消息时,应该使用哪种 channel 类型?

c - 如何正确传递单个字符作为对 C 中另一个方法的引用

Java 泛型。泛型类型的数组

php - 如何在 PHP 中搜索数组中的多个值?

git - 我正在尝试安装 Go lang 包,但它给出了这样的错误::错误:以下未跟踪的工作树文件将被 merge 覆盖

oracle - 是否可以在 Docker 中安装 gopkg.in 包?

c++ - 通过引用转换指针

language-agnostic - 按引用传递与按值传递有什么区别?