1 回答
TA贡献1784条经验 获得超2个赞
这是包初始化的结果,其中:
依赖分析不依赖于变量的实际值,只依赖于源中对它们的词汇引用,并进行传递分析。
例如,如果一个变量x的初始化表达式引用了一个函数,该函数的主体引用了变量,y那么x依赖于y.
如:“对变量或函数的引用是表示该变量或函数的标识符。”
您在操场上的示例返回更直接的内容:
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 关注
- 130 浏览
添加回答
举报