我想从 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()中定义的size和capacity
最佳答案
事实证明,我自己找到了答案。由于 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/