1 回答

TA貢獻1784條經驗 獲得超2個贊
這是包初始化的結果,其中:
依賴分析不依賴于變量的實際值,只依賴于源中對它們的詞匯引用,并進行傳遞分析。
例如,如果一個變量x的初始化表達式引用了一個函數,該函數的主體引用了變量,y那么x依賴于y.
如:“對變量或函數的引用是表示該變量或函數的標識符?!?/p>
您在操場上的示例返回更直接的內容:
tmp/sandbox395359317/main.go:21: initialization loop:
prog.go:21 g refers to
prog.go:28 (*parser).callonIncludeOp1 refers to
prog.go:21 g
Go 中有一些用于松散耦合的技術,例如接口。
作為一個例子(不是最優的,但至少打破了初始化周期),你可以//A添加:
type parseIncluder interface {
parseInclude(fileName string) (interface{}, error)
}
func (c *current) parseInclude(fileName string) (interface{}, error) {
return parseInclude(fileName)
}
在 中//B,調用parseInclude()變為:
got, _ := c.cParseIncluder().parseInclude("x")
請參閱Go plaground并單擊Run:不再initialization loop。
OP Red Skotina使用了一種不同的方法來封裝init()函數:
var gProxy grammar
func init() { gProxy = g }
func parseInclude(fileName string) (interface{}, error) {
got, _ := ParseReaderProxy(fileName)
return got, nil
}
func ParseReaderProxy(filename string) (interface{}, error) {
p := &parser{filename: filename}
return p.parse(gProxy)
}
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報