函数是否可以更改在别处声明的字符串数组切片的大小?高朗

Is it possible for a function to change the size of a slice of string array declared elsewhere? golang

我想从适当的切片中删除一个元素。但是当我这样做时,我最终会在底层数组中生成两个空元素。 我已经搜索了 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 可以 return sizecapacity 定义在 rmDup()

Is there any way that str in main can return the size and capacity defined in rmDup()?

例如,

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(len(str), cap(str), str)
    str = rmDup(str)
    fmt.Println(len(str), cap(str), str)
}

输出:

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

i meant in place without the function rmDup() having to return anything.

例如,

package main

import "fmt"

//String remove adjacent duplicates from a string array
func rmDup(str *[]string) {
    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
}

func main() {
    str := []string{"dog", "cat", "cat", "mouse", "mouse", "zebra", "zebra"}
    fmt.Println(len(str), cap(str), str)
    rmDup(&str)
    fmt.Println(len(str), cap(str), str)
}

输出:

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

原来是我自己找到了答案。由于 Go 语言按值执行函数调用,因此不可能更改在另一个范围内声明的切片,除非使用指针。

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