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 關注
- 289 瀏覽
添加回答
舉報