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++
}
答案 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
切片),能够使用索引设置值的原因是因为索引已经分配。