3 回答
TA贡献1859条经验 获得超6个赞
首先让我们解释一下:
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 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内置函数将元素附加到切片的末尾。如果它有足够的容量,则重新划分目标以容纳新元素。如果没有,将分配一个新的底层数组。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 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
}
TA贡献1799条经验 获得超8个赞
问题是您正在创建一个长度为 的切片0,但最大容量为4,但同时您正试图为创建的切片的第零个索引分配一个值,该索引通常为空。这就是您收到index out of range error.
result := make([]string, 0, 4)
fmt.Println(len(result)) //panic: runtime error: index out of range
您可以使用以下方法更改此代码:
result := make([]string, 4)
这意味着容量将与切片长度相同。
fmt.Println(cap(result)) // 4
fmt.Println(len(result)) // 4
您可以在此处阅读有关数组、切片和映射的信息:https ://blog.golang.org/go-slices-usage-and-internals
- 3 回答
- 0 关注
- 368 浏览
添加回答
举报
