Frage

Ich fühle mich ein wenig albern, da dies leicht sein sollte, aber ich mit Go gerade begonnen und kann es nicht herausgefunden.

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

Beim Kompilieren gibt es die Fehler:

q.go:11:12: error: expected ';' or '}' or newline
q.go:12:12: error: expected ';' or '}' or newline

, die mit der Öffnung der Strebe item.q bezeichnet [n.]: = Q und die folgende Zeile

Ich bin sicher, dass ich Scheiben mit falsch, da es gut mit einem einfachen String arbeitet statt, aber ich bin nicht sicher, wie es zu beheben.

edit: Ich habe wieder eingeführt es StringVectors gemäß Pat Notz Rat mit und es funktioniert gut. Im Folgenden ist der Arbeitscode:

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)
}
War es hilfreich?

Lösung

wichen Sie die Probleme, die Sie wurden mit Scheiben, indem es sie StringVector delegieren. Ich habe Ihre erste Implementierung überarbeitet, mit der String-Scheiben, ein gültiges, Arbeitsprogramm zu werden.

type Question struct {
    q   []string
    a   []string
}

Die Art Frage ist eine Struktur, welche zwei Elemente aufweist, Q und A, die Scheiben von einem Array von Zeichenketten sind. Eine Scheibe implizit enthält einen Zeiger auf das Element des Arrays, die die Scheibe beginnt, die Länge der Scheibe, und die Kapazität der Scheibe.

var q Question

q erklärt, die Lagerung für die Frage struct Zuteilen und initialisiert die struct Felder (slices q.q und q.a) auf Null d.h. die Scheibenzeiger sind nil, und die Scheibe len () und die Kappe (Funktionen) return null. Keine Speicherung wird für String-Arrays zugeordnet sind; wir müssen das separat tun.

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

Andere Tipps

Eine Scheibe ist einfach eine Ansicht in ein Array - nicht um eine tatsächliche Array. Basierend auf Ihren Code-Schnipsel Ich glaube, Sie StringVector vom container/vector Paket verwenden möchten. Das ist wirklich die einzige Wahl für die dynamische Größe Arrays. Die eingebaute Arrays hat eine feste Größe. Sie würden gut funktionieren auch, wenn Sie im Voraus wissen, wie viele Elemente Sie speichern möchten.

Das Problem ist in der Add-Methode - wenn Sie ein Element einer Scheibe zuweisen, sollten Sie verwenden ‚=‘ statt ‚: =‘

func (item *Question) Add(q string, a string) {
 n := len(item.q)
 item.q[n] = q
 item.a[n] = a
}

Der Operator: = nur für die Deklaration von neuen Variablen verwendet wird

Sie sollten nicht := wie in item.q[n] := q werden.

:= wird nur verwendet, wenn Sie zu einer neuen Variablen zugewiesen haben.

In diesem Fall müssen Sie nur item.q[n] = q

verwenden

Es ist besser, auch Scheiben zu verwenden, anstatt des Containers / Vektor. gehen (1.0.3) nicht unterstützt Vektor mehr.

Eine bessere Möglichkeit, ein Element zu einer Scheibe anzuhängen ist

slice = append(slice, new_item_1,item_2,item_3)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top