函数是否可以更改其他地方声明的字符串数组的大小? golang

时间:2017-03-25 16:23:34

标签: arrays go pass-by-reference slice

我想从切片中删除一个元素。但是当我这样做时,我最终会在底层数组中生成两个空元素。 我已经搜索了herehere

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()中定义的大小容量

2 个答案:

答案 0 :(得分:1)

  

str中的main是否可以返回大小和容量   在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]
  

我的意思是没有函数rmDup()必须返回   任何东西。

例如,

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]

答案 1 :(得分:1)

事实证明我能够自己找到答案。由于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