Utilizando un trozo de cadena que se va a llenar en tiempo de ejecución
-
20-09-2019 - |
Pregunta
Me siento un poco tonto como esto debe ser una tarea fácil, sin embargo me dedique a la cita y no puedo entenderlo.
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.")
}
Cuando Compilarlo da los errores:
q.go:11:12: error: expected ';' or '}' or newline q.go:12:12: error: expected ';' or '}' or newline
que se refiere a la llave de apertura de item.q [n]:. = Q y la siguiente línea
Estoy seguro de que estoy usando rebanadas de forma incorrecta, ya que funciona bien con una simple cadena en su lugar, pero no estoy seguro de cómo solucionarlo.
editar: He re-ejecutado utilizando StringVectors según el consejo de Pat Notz y funciona bien. El siguiente es el código de trabajo:
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)
}
Solución
Se hizo a un lado los problemas que estaban teniendo usando rebanadas delegándolas a StringVector. He revisé su implementación inicial, que utiliza rebanadas de cuerda, para convertirse en un programa válido, trabajando.
type Question struct {
q []string
a []string
}
El tipo de pregunta es una estructura que tiene dos elementos, q y A, que son rebanadas de una matriz de cadenas. Una rebanada contiene implícitamente un puntero al elemento de la matriz que comienza el corte, la longitud de la rebanada, y la capacidad de la rebanada.
var q Question
declara q, asignación de almacenamiento para el struct Pregunta, e inicializa los campos struct (rebanadas q.q y q.a) a cero es decir, los punteros rebanada son nulas, y la len slice () y la tapa () devuelven cero. No se asigna almacenamiento de matrices de cadenas; tenemos que hacer eso por separado.
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)
}
Otros consejos
Una rebanada es simplemente una vista en una matriz - no una matriz real. Basado en el fragmento de código Creo que desee utilizar StringVector
del paquete container/vector
. Eso es realmente la única opción para las matrices de tamaño dinámico. El construido en matrices tienen un tamaño fijo. Habían funcionan muy bien también si se sabe de antemano el número de elementos que desea almacenar.
El problema está en el método Add - cuando se asigna un elemento de un segmento, se debe utilizar '=' en lugar de ': ='
func (item *Question) Add(q string, a string) {
n := len(item.q)
item.q[n] = q
item.a[n] = a
}
El operador: = sólo se utiliza para declarar nuevas variables
Usted no debe estar usando :=
como en item.q[n] := q
.
:=
sólo se utiliza cuando se tiene que asignar a una nueva variable.
En este caso, sólo hay que utilizar item.q[n] = q
Su también mejor utilizar rebanadas en lugar de contenedor / vector. ir (1.0.3) no soporta el vector más.
Una mejor manera de añadir un elemento a una rebanada es
slice = append(slice, new_item_1,item_2,item_3)