dongyong1942 2019-01-04 22:23
浏览 39
已采纳

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

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++
    }
  • 写回答

2条回答 默认 最新

  • drl2051 2019-01-04 22:32
    关注

    Your slice a needs to be allocated utilizing make.

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

    where n is the size of the slice.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题