Вы обошли проблемы, возникавшие при использовании срезов, делегировав их в StringVector. Я пересмотрел вашу первоначальную реализацию, которая использовала кусочки строк, чтобы она стала действующей, работающей программой.
type Question struct {
q []string
a []string
}
Тип Question - это структура, которая имеет два элемента, q и a, которые являются кусочками массива строк. Срез неявно содержит указатель на элемент массива, который начинает срез, длину среза и емкость среза.
var q Question
объявляет q, выделяя память для структуры Question, и инициализирует поля структуры (слайсы q.q и q.a) равными нулю, т.е. указатели слайса равны нулю, а функции slice 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)
}