Индекс вне диапазона пытается добавить к срезу - PullRequest
0 голосов
/ 05 января 2019
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++
}

Разве это не должно быть создание нулевого среза, а затем добавление значения в соответствующее место? Я продолжаю получать индекс вне диапазона, поэтому я предполагаю, что он не добавляет к 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 голосов
/ 05 января 2019

Удаляя некоторые контекстно-зависимые части вашего кода, вы должны использовать метод 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 с использованием среза) причина, по которой вы можете устанавливать значения с помощью индексов, заключается в том, что индекс уже был выделен.

0 голосов
/ 05 января 2019

Ваш срез a должен быть выделен с использованием make.

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

, где n - размер среза.

...