2010-02-13 21 views
1

Je me sens un peu bête car cela devrait être facile, mais je viens de commencer avec go et je n'arrive pas à comprendre.Utilisation d'une tranche de chaîne à remplir à l'exécution

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

Lors de la compilation, il donne les erreurs:

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

qui fait référence à l'accolade d'ouverture de item.q [n]: = q et la ligne suivante.

Je suis certain que j'utilise des tranches incorrectement car cela fonctionne bien avec une simple chaîne à la place, mais je ne suis pas sûr de savoir comment résoudre ce problème.

edit: Je l'ai ré-implémenté en utilisant StringVectors selon les conseils de Pat Notz et ça marche bien. Ce qui suit est le code de travail:

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

Répondre

0

Vous avez contourné les problèmes que vous aviez en utilisant les tranches en les déléguant à StringVector. J'ai modifié votre implémentation initiale, qui utilisait des tranches de chaîne, pour devenir un programme de travail valide.

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

La question du type est une struct qui comporte deux éléments, q et un, qui sont des tranches d'un tableau de chaînes. Une tranche contient implicitement un pointeur sur l'élément du tableau qui commence la tranche, la longueur de la tranche et la capacité de la tranche.

var q Question 

déclare q, l'allocation de stockage pour la struct question et initialise les fonctions champs de struct (tranches de qq et Qa) à zéro dire que les pointeurs de tranche sont nuls, et la tranche len() et le capuchon() renvoient zéro . Aucun stockage n'est alloué pour les tableaux de chaînes; nous devons le faire séparément.

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

Cette implémentation est bien pire que l'utilisation d'un StringVector, à cause de toutes les allocations et copies inutiles nécessaires à cette implémentation. On dirait que la bibliothèque de go n'a plus de vecteurs. Seules les listes sont disponibles. – Sahas

+0

vous devriez utiliser 'append' pour ajouter ajouter quelque chose à une tranche efficacement – newacct

2

Une tranche est tout simplement une vue dans un tableau - pas un tableau réel. Basé sur votre extrait de code, je pense que vous voulez utiliser StringVector du paquet container/vector. C'est vraiment votre seul choix pour les tableaux de taille dynamique. Les tableaux intégrés ont une taille fixe. Ils fonctionneraient bien aussi si vous savez à l'avance combien d'éléments vous voulez stocker.

+0

merci, je vais voir ça! – smskelley

1

Le problème est dans la méthode Add - lorsque vous attribuez un élément d'une tranche, vous devez utiliser « = » au lieu de « : = »

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

Le: = opérateur est utilisé uniquement pour déclarer nouvelles variables

+0

alors qu'il compile en utilisant cette méthode, à l'exécution il lance: index hors limites panique Abandonné – smskelley

0

Vous ne devriez pas utiliser := comme dans item.q[n] := q.

:= est uniquement utilisé lorsque vous devez affecter une nouvelle variable.

Dans ce cas, il vous suffit d'utiliser item.q[n] = q

Il est également préférable d'utiliser des tranches au lieu de l'emballage/vecteur. go (1.0.3) ne supporte plus le vecteur.

Une meilleure façon d'ajouter un élément à une tranche est

slice = append(slice, new_item_1,item_2,item_3)