1

これは簡単なはずなので、少しばかげているように感じますが、goを始めたばかりで、理解できません。

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: エラー: 予想される ';' または「}」または改行
q.go:12:12: エラー: 予想される ';' または「}」または改行

これは、 item.q[n] := q の左中括弧と次の行を参照します。

代わりに単純な文字列でうまく機能するので、スライスを間違って使用していることは確かですが、それを修正する方法がわかりません。

編集: Pat Notz のアドバイスに従って StringVectors を使用して再実装しましたが、うまく機能します。以下は作業コードです。

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

4 に答える 4

2

スライスは単なる配列のビューであり、実際の配列ではありません。コードスニペットに基づいてStringVectorcontainer/vectorパッケージから使用したいと思います。これは、動的にサイズ設定されたアレイの唯一の選択肢です。組み込み配列のサイズは固定されています。保存したい要素の数を事前に知っていれば、それらもうまく機能します。

于 2010-02-13T14:37:54.027 に答える
1

問題は Add メソッドにあります。スライスの要素を割り当てるときは、「:=」ではなく「=」を使用する必要があります。

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

:= 演算子は、新しい変数を宣言するためにのみ使用されます

于 2010-02-13T15:44:19.787 に答える
0

のように使用:=しないでくださいitem.q[n] := q

:=新しい変数に割り当てる必要がある場合にのみ使用されます。

この場合、あなたはただ使用する必要がありますitem.q[n] = q

コンテナ/ベクターの代わりにスライスを使用することもお勧めします。go(1.0.3)はベクターをサポートしなくなりました。

スライスにアイテムを追加するためのより良い方法は

slice = append(slice, new_item_1,item_2,item_3)
于 2012-12-16T14:00:34.860 に答える
0

スライスを StringVector に委譲することで、スライスを使用していた問題を回避しました。文字列スライスを使用した最初の実装を修正して、有効で機能するプログラムにしました。

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

Question 型は、文字列の配列のスライスである q と a の 2 つの要素を持つ構造体です。スライスには、スライスを開始する配列の要素へのポインター、スライスの長さ、およびスライスの容量が暗黙的に含まれます。

var q Question

q を宣言し、Question 構造体にストレージを割り当て、構造体フィールド (スライス qq および qa) をゼロに初期化します。つまり、スライス ポインターは 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)
}
于 2010-02-14T16:39:50.153 に答える