使用要在运行时填充的字符串切片

时间:2010-02-13 07:50:19

标签: go containers slice

我感觉有点傻,因为这应该是一个简单的,但我刚刚开始,无法弄明白。

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

4 个答案:

答案 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)