BIG阳
首先让我们解释一下:result := make([]string, 0, 4)make内置函数分配和初始化一个[]stringcall it Sliceof类型的对象string切片内部:切片是数组段的描述符。它由指向数组的指针、段的长度及其容量(段的最大长度)组成。所以result := make([]string, 0, 4)分配和初始化一个类型[]string为length = 0and的对象capacity = 4。并result := make([]string, 4, 4)分配和初始化一个类型[]string为length = 4and的对象capacity = 4,它等于result := make([]string, 4)。result := make([]string, 0, 4)现在和有什么区别result := make([]string, 4):这个result := make([]string, 0, 4)Slice 的底层数组是空的,这意味着使用result[0]will panic: runtime error: index out of range。这个result := make([]string, 4)Slice 的底层数组有 4 个string元素,意思是使用result[0], result[1], result[2],result[3]是可以的:package mainimport "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 mainimport "fmt"func main() { result := []string{"", "", "", ""} fmt.Printf("%q, %q, %q, %q \n", result[0], result[1], result[2], result[3])}输出与上面的代码相同:"", "", "", "" append内置函数将元素附加到切片的末尾。如果它有足够的容量,则重新划分目标以容纳新元素。如果没有,将分配一个新的底层数组。Append 返回更新后的切片。因此有必要将 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 mainimport ( "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 mainimport ( "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}