首先解释一下:
result := make([]string, 0, 4)
make 内置函数分配并初始化一个 []string 类型的对象,将其称为 Slice 的 string
Slice internals:
切片是数组段的描述符。它由一个指针组成
到数组,段的长度,以及它的容量(最大
段的长度)。
所以result := make([]string, 0, 4) 使用length = 0 和capacity = 4 分配并初始化[]string 类型的对象。
而result := make([]string, 4, 4)用length = 4和capacity = 4分配和初始化[]string类型的对象,等于result := make([]string, 4)。
现在result := make([]string, 0, 4)和result := make([]string, 4)有什么区别:
使用result := make([]string, 0, 4),这个 Slice 的底层数组是空的,这意味着使用 result[0] 会恐慌:运行时错误:索引超出范围。
使用result := make([]string, 4),这个Slice的底层数组有4个string元素,意思是使用result[0]、result[1]、result[2]、result[3]是可以的:
package main
import "fmt"
func main() {
result := make([]string, 4)
fmt.Printf("%q, %q, %q, %q \n", result[0], result[1], result[2], result[3])
}
输出:
"", "", "", ""
而result := make([]string, 4) 等于result := []string{"", "", "", ""} 意思是这个代码:
package main
import "fmt"
func main() {
result := []string{"", "", "", ""}
fmt.Printf("%q, %q, %q, %q \n", result[0], result[1], result[2], result[3])
}
输出和上面的代码一样:
"", "", "", ""
append 内置函数
将元素附加到切片的末尾。如果容量足够,
目的地被重新分割以适应新元素。如果它
没有,将分配一个新的底层数组。追加返回
更新切片。因此有必要存储结果
附加,通常在保存切片本身的变量中:
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
作为一种特殊情况,将字符串附加到字节切片是合法的,
像这样:
slice = append([]byte("hello "), "world"...)
现在在你的函数 myFunc 内部的代码中,在 result := make([]string, 0, 4) 之后,你可以使用 append,就像这个工作代码 (The Go Playground):
package main
import (
"fmt"
"strings"
)
func main() {
strs := strings.Fields("Political srt")
fmt.Println(len(strs)) // It's not empty so why index out of range
fmt.Println(strs, strs[0], strs[1])
fmt.Println(strings.ContainsAny(strs[0], "eaiuo"))
fmt.Println(myFunc("Political srt"))
}
func myFunc(input string) []string {
strs := strings.Fields(input)
result := make([]string, 0, 4)
for i := 0; i < len(strs); i++ {
if strings.ContainsAny(strs[i], "eaiu") {
result = append(result, strs[i])
} else {
result = append(result, strs[i])
}
}
return result
}
您可以简化该代码,例如这个工作代码 (The Go Playground):
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(myFunc("Political srt"))
}
func myFunc(input string) []string {
strs := strings.Fields(input)
result := make([]string, 0, 4)
for _, s := range strs {
if strings.ContainsAny(s, "eaiu") {
result = append(result, s)
}
}
return result
}