-2
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 切片然后将值添加到适当的位置吗?我一直让索引超出范围,所以我认为它没有添加到a[i]...

首先检查长度

if len(a) > 0 {
    a[i] = foo
}

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

更新:我确实最终使用了追加...我打算更新这个线程,但谢谢你们俩。

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++
    }
4

2 回答 2

1

您的切片a需要使用make.

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

n切片的大小在哪里。

于 2019-01-04T22:32:11.157 回答
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切片)时,您能够使用索引设置值的原因是因为索引已经被分配。

于 2019-01-05T00:18:08.970 回答