试图添加到切片的索引超出范围

时间:2019-01-04 22:23:38

标签: arrays loops go

var bar string
var i int
var a []string
for foo, _ := reader.NextWord(); foo != bar; foo, _ = reader.NextWord() {
    bar = foo
    fmt.Print(foo)
    a[i] = foo
    i++
}

这不是要创建一个nil slice然后将值添加到适当的位置吗?我一直使索引超出范围,所以我认为它没有添加到a[i] ...

首先使用

检查长度
if len(a) > 0 {
    a[i] = foo
}

似乎有帮助,但没有获得我期望的结果。我会继续玩。

更新:我最终还是使用了append ...我打算更新此线程,但谢谢你们。

package main

import (
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/steven-ferrer/gonsole"
)

func main() {
    file, err := os.Open("test.txt")
    if err != nil {
        log.Println(err)
    }
    defer file.Close()

    reader := gonsole.NewReader(file)

    // cycle through
    var bar string
    var i int

    var quality []string = make([]string, 0)
    var tempName []string = make([]string, 0)
    var name []string = make([]string, 0)

    for foo, _ := reader.NextWord(); foo != bar; foo, _ = reader.NextWord() {
        bar = foo

        if strings.Contains(foo, "(normal)") {
            quality = append(quality, "normal")
            for state := 0; state < 1; foo, _ = reader.NextWord() {
                if foo == "|" {
                    state = 1
                }
                tempName = append(tempName, foo)
            }
            nameString := strings.Join(tempName, "")
            name = append(name, nameString)
        } else if strings.Contains(foo, "(unique)") {
            quality = append(quality, "unique")
            for state := 0; state < 1; foo, _ = reader.NextWord() {
                if foo == "|" {
                    state = 1
                }
                tempName = append(tempName, foo)
            }
            nameString := strings.Join(tempName, "")
            name = append(name, nameString)
        } else if strings.Contains(foo, "(set)") {
            quality = append(quality, "set")
            for state := 0; state < 1; foo, _ = reader.NextWord() {
                if foo == "|" {
                    state = 1
                }
                tempName = append(tempName, foo)
            }
            nameString := strings.Join(tempName, "")
            name = append(name, nameString)
        }
        if tempName != nil {
            tempName = nil // clear tempName
        }
        i++
    }

2 个答案:

答案 0 :(得分:1)

您需要使用a来分配切片make

var a []string = make([]string, n)

其中n是切片的大小。

答案 1 :(得分:0)

删除代码的某些特定于上下文的部分,您应该针对动态长度切片使用append方法。

package main

import (
    "fmt"
    "strings"
)

func main() {
    book := "Lorem ipsum dolor sit amet"
    var words []string

    for _, word := range strings.Split(book, " ") {
        words = append(words, word)
    }

    fmt.Printf("%+v\n", words)
}

https://play.golang.org/p/LMejsrmIGb9

如果您预先知道值的数量,则可以使用words := make([]string, 5)对于固定长度的切片实现相同的功能,但是我怀疑在这种情况下这就是您想要的。

您的代码导致错误的原因是因为切片没有以任何给定的长度初始化,因此索引尚不存在。通常,使用切片时,append是您想要的方法。

与此相反,在使用现有切片时(即range切片),能够使用索引设置值的原因是因为索引已经分配。