我感觉有点傻,因为这应该是一个简单的,但我刚刚开始,无法弄明白。
package main
import "fmt"
type Question struct {
q []string
a []string
}
func (item *Question) Add(q string, a string) {
n := len(item.q)
item.q[n] := q
item.a[n] := a
}
func main() {
var q Question
q.Add("A?", "B.")
}
编译时会出现错误:
q.go:11:12: error: expected ';' or '}' or newline q.go:12:12: error: expected ';' or '}' or newline
指的是item.q [n]:= q和下一行的左括号。
我确定我正在使用切片不正确,因为它使用简单的字符串工作正常,但我不确定如何解决它。
编辑:我已根据Pat Notz的建议使用StringVector重新实现它,并且效果很好。以下是工作代码:
package main
import (
fmt "fmt"
vector "container/vector"
)
type Question struct {
q vector.StringVector
a vector.StringVector
}
func (item *Question) Add(q string, a string) {
item.q.Push(q)
item.a.Push(a)
}
func (item *Question) Print(index int) {
if index >= item.q.Len() {
return
}
fmt.Printf("Question: %s\nAnswer: %s\n", item.q.At(index), item.a.At(index))
}
func main() {
var q Question
q.Add("A?", "B.")
q.Print(0)
}
答案 0 :(得分:2)
切片只是一个视图到一个数组中 - 而不是一个实际的数组。根据您的代码段,我认为您希望使用StringVector
包中的container/vector
。这是动态大小的数组的唯一选择。内置数组具有固定大小。如果您事先知道要存储多少元素,它们也能正常工作。
答案 1 :(得分:1)
问题出在Add方法中 - 当您指定切片的元素时,应使用'='而不是':='
func (item *Question) Add(q string, a string) {
n := len(item.q)
item.q[n] = q
item.a[n] = a
}
:=运算符仅用于声明新变量
答案 2 :(得分:0)
您通过将切片委托给StringVector来回避使用切片时遇到的问题。我已经修改了使用字符串切片的初始实现,以成为一个有效的工作程序。
type Question struct {
q []string
a []string
}
类型Question是一个结构,它有两个元素q和a,它们是字符串数组的切片。切片隐式包含指向开始切片的数组元素的指针,切片的长度以及切片的容量。
var q Question
声明q,为Question结构分配存储,并将struct字段(slice q.q和q.a)初始化为零,即切片指针为nil,切片len()和cap()函数返回零。没有为字符串数组分配存储空间;我们需要单独完成。
package main
import "fmt"
type Question struct {
q []string
a []string
}
func addString(ss []string, s string) []string {
if len(ss)+1 > cap(ss) {
t := make([]string, len(ss), len(ss)+1)
copy(t, ss)
ss = t
}
ss = ss[0 : len(ss)+1]
ss[len(ss)-1] = s
return ss
}
func (item *Question) Add(q string, a string) {
item.q = addString(item.q, q)
item.a = addString(item.a, a)
}
func main() {
var q Question
q.Add("A?", "B.")
fmt.Println("Q&A", q)
}
答案 3 :(得分:0)
您不应该像:=
中那样使用item.q[n] := q
。
:=
仅在您必须分配给新变量时使用。
在这种情况下,您只需使用item.q[n] = q
使用切片而不是容器/矢量也更好。 go(1.0.3)不再支持向量。
将项目附加到切片的更好方法是
slice = append(slice, new_item_1,item_2,item_3)