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

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

Shouldn't this be creating a nil slice and then adding the value to the appropriate place? I keep getting index out of range so I assume it's not adding to a[i]...

Checking length first with

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

seems to help, but not getting the results I expected. I'll keep playing around.

Update: I did end up using append... I meant to update this thread but thank you both.

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

Your slice a needs to be allocated utilizing make.

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

where n is the size of the slice.

Removing some of the context-specific parts of your code, you should be using the append method against a dynamic-length slice.

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
", words)
}

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

If you know the number of values up front, the same can be achieved for a fixed length slice by using words := make([]string, 5), but I doubt this is what you want in this case.

The reason your code is causing you errors is because your slice isn't initialized at any given length, so your indexes don't yet exist. Generally when working with a slice, append is the method you want.

Opposite to this, when working with existing slices (ie, rangeing an slice), the reason you're able to set the values using indexes is because the index has already been allocated.