亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當數組的長度不為空時,出現“恐慌:運行時錯誤:索引超出范圍”

當數組的長度不為空時,出現“恐慌:運行時錯誤:索引超出范圍”

Go
米脂 2022-03-03 15:09:53
我很難學習如何在 Go 中遍歷一個字符串來做一些事情(特別是,將單詞分開而不是包含元音)。我寫了這個代碼片段: https: //play.golang.org/p/zgDtOyq6qf。這是我在運行它時遇到的錯誤:panic: runtime error: index out of rangegoroutine 1 [running]:panic(0x1045a0, 0x1040a010)    /usr/local/go/src/runtime/panic.go:500 +0x720main.myFunc(0x114130, 0x4, 0x0, 0x0, 0x0, 0x3ba3)    /tmp/sandbox960520145/main.go:19 +0x1a0main.main()    /tmp/sandbox960520145/main.go:10 +0x40我在這個論壇上搜了一下,有人說是數組長度的問題,但是這里不是這樣的。我無法弄清楚如何解決這個問題。有人可以提出一些建議嗎?
查看完整描述

3 回答

?
BIG陽

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

}


查看完整回答
反對 回復 2022-03-03
?
守著星空守著你

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


查看完整回答
反對 回復 2022-03-03
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

出現索引超出范圍錯誤,因為您沒有result以足夠的長度初始化數組。

myFunc中,您有:

result := make([]string, 0, 4)

這將創建一個字符串切片,該切片具有長度為 4 的底層數組,但由于您已將切片長度聲明為 0,因此切片無法訪問底層數組中的任何元素。所以 evenresult[0]超出了可用索引的范圍。

要解決此問題,只需提供足夠大的長度參數即可make

result := make([]string, 4, 4)

您可以在此處閱讀有關切片如何操作的更多信息。


查看完整回答
反對 回復 2022-03-03
  • 3 回答
  • 0 關注
  • 289 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號