2014-10-02 20 views
17

Sono novizio in Go. Questo problema mi sta facendo impazzire. Come si inizia la matrice di strutture in Go?Inizio array di strutture in Go

type opt struct { 
    shortnm  char 
    longnm, help string 
    needArg  bool 
} 

const basename_opts []opt { 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a"} 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b"} 
    } 

Il compilatore ha dichiarato di aspettarsi ";" dopo [] opt.

Dove dovrei inserire le parentesi '{' per iniziare il mio array di struct?

Grazie

risposta

30

Sembra che si sta tentando di utilizzare (quasi) verso l'alto codice C qui. Go ha alcune differenze.

  • Prima di tutto, non è possibile inizializzare matrici e sezioni come const. Il termine const ha un significato diverso in Go, come in C. L'elenco deve essere definito come var.
  • In secondo luogo, come regola di stile, Go preferisce basenameOpts anziché basename_opts.
  • Non c'è il tipo char in Go. Probabilmente si desidera byte (o rune se si intende consentire codepoint unicode).
  • In questo caso la dichiarazione della lista deve avere l'operatore di assegnazione. Es .: var x = foo.
  • Il parser di Go richiede che ogni elemento di una dichiarazione di lista termini con una virgola. Questo include l'ultimo elemento. Il motivo è perché Go inserisce automaticamente i punti e virgola , se necessario. E questo richiede una sintassi un po 'più rigida per funzionare.

Ad esempio:

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts = []opt { 
    opt { 
     shortnm: 'a', 
     longnm: "multiple", 
     needArg: false, 
     help: "Usage for a", 
    }, 
    opt { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

Un'alternativa è dichiarare la lista al suo tipo e quindi utilizzare una funzione init per riempirlo. Ciò è utile soprattutto se si intende utilizzare i valori restituiti dalle funzioni nella struttura dati. Le funzioni init vengono eseguite quando il programma viene inizializzato e sono garantite per il completamento prima che venga eseguito main. È possibile avere più funzioni init in un pacchetto o anche nello stesso file sorgente.

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts []opt 

func init() { 
    basenameOpts = []opt{ 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a", 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b", 
     }, 
    ) 
} 

Dal momento che sei un nuovo Go, vi raccomando vivamente la lettura attraverso the language specification. È piuttosto breve e scritto molto chiaramente. Cancellerà molte di queste piccole idiosincrasie per te.

18

Aggiungendo questo solo come aggiunta al @ jimt è eccellente risposta:

un modo comune per definire tutto in fase di inizializzazione si utilizza uno struct anonymous:

var opts = []struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
}{ 
    {'a', "multiple", "Usage for a", false}, 
    { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

Questo è comunemente utilizzato per il test come bene per definire alcuni casi di test e scorrere attraverso di loro.

Problemi correlati