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)
}
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top