J'ai un code généré automatiquement. Version simplifiée:Erreur de cycle d'initialisation
package main
// begin of A
func main(){
ParseReader("x")
}
func parseInclude(fileName string) (interface{}, error) {
got, _ := ParseReader(fileName)
return got, nil
}
// end of A
type grammar struct {
pos int
run func(*parser) (interface{}, error)
}
var g = &grammar{
pos: 1,
run: (*parser).callonIncludeOp1,
}
type parser struct {
filename string
cur current
}
func (p *parser) callonIncludeOp1() (interface{}, error) {
return p.cur.onIncludeOp1("x")
}
func (p *parser) parse(g *grammar) (val interface{}, err error) {
return g.pos, nil
}
type current struct {
pos int
}
// B
func (c *current) onIncludeOp1(qfilename interface{}) (interface{}, error) {
got, _ := parseInclude("x")
return got, nil
}
func ParseReader(filename string) (interface{}, error) {
p := &parser{ filename: filename }
return p.parse(g)
}
J'ai erreur après la compilation
./prog.go:19: initialization loop:
/home/gCDfp4/prog.go:19 g refers to
/home/gCDfp4/prog.go:25 (*parser).callonIncludeOp1 refers to
/home/gCDfp4/prog.go:36 (*current).onIncludeOp1 refers to
/home/gCDfp4/prog.go:7 parseInclude refers to
/home/gCDfp4/prog.go:41 ParseReader refers to
/home/gCDfp4/prog.go:19 g
je dois faire appel récursif à la grammaire parce que j'ai opérateur préprocesseur « #include » pour l'analyse syntaxique autre fichier.
Parce qu'il est le code généré automatiquement je ne peux modifier le code dans le bloc A ou B. en fonction
Comment puis-je briser le cycle d'initialisation?
merci. i rompre le cycle avec var gProxy grammaire func init() { gProxy = g } func parseInclude (string fileName) (interface {}, erreur) { obtenu, _: = ParseReaderProxy (fileName) retour obtenu, } func ParseReaderProxy (chaîne de nom de fichier) (interface {}, erreur) { p: = & parser {nomfichier: nomfichier} return p.analyser (gProxy) } votre réponse est d'une autre manière mais semble meilleure. –
@RedSkotina Cela fonctionnerait aussi en effet. J'ai inclus votre approche dans la réponse pour plus de visibilité (et un formatage correct) – VonC