首先我们来解释一下:
result := make([]string, 0, 4)
The make内置函数分配并初始化类型的对象[]string
叫它Slice
of string
切片内部结构:
切片是数组段的描述符。它由一个指针组成
到数组,段的长度及其容量(最大
段的长度)。
So result := make([]string, 0, 4)
分配并初始化类型的对象[]string
with length = 0
and capacity = 4
.
And result := make([]string, 4, 4)
分配并初始化类型的对象[]string
with length = 4
and capacity = 4
,等于result := make([]string, 4)
.
现在有什么区别result := make([]string, 0, 4)
and result := make([]string, 4)
:
With result := make([]string, 0, 4)
该 Slice 的底层数组为空意味着使用result[0]
会恐慌:运行时错误:索引超出范围。
With result := make([]string, 4)
该 Slice 的底层数组有 4string
元素,意思是使用result[0]
, result[1]
, result[2]
, result[3]
is OK:
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])
}
output:
"", "", "", ""
And 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])
}
输出与上面的代码相同:
"", "", "", ""
The append内置功能
将元素附加到切片的末尾。如果容量足够的话
目的地被重新切片以容纳新元素。如果它
否则,将分配一个新的底层数组。追加返回
更新了切片。因此需要保存结果
附加,通常在保存切片本身的变量中:
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
作为一种特殊情况,将字符串附加到字节切片是合法的,
像这样:
slice = append([]byte("hello "), "world"...)
现在在你的函数内的代码中myFunc
after result := make([]string, 0, 4)
,你可以使用append
,就像这个工作代码(围棋游乐场):
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
}
您可以简化该代码,例如这个工作代码(围棋游乐场):
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
}