我想从切片中删除一个元素。但是当我这样做时,我最终会在底层数组中生成两个空元素。 我已经搜索了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()中定义的大小和容量
答案 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