Go语言如何从ast.File实例获取解析时传入的源文件路径
解答
*ast.File 结构体本身没有直接存储传入的源文件路径字段,你需要配合解析时传入的*token.FileSet实例获取路径,具体操作如下:
- 调用AST实例
f的Pos()方法,获取该语法树对应的起始token位置 - 使用解析时传入的同一个
fset实例调用File()方法,传入上一步拿到的起始位置,得到对应的*token.File实例 - 调用
*token.File实例的Name()方法,返回值就是当初传入ParseFile的srcPath参数值
参考实现代码:
// 注意:解析时使用的fset实例必须保留,不可替换为新建的FileSet fset := token.NewFileSet() f, err := parser.ParseFile(fset, srcPath, nil, 0) if err != nil { // 按业务逻辑处理解析错误 panic(err) } // 提取源文件路径 tokenFile := fset.File(f.Pos()) if tokenFile == nil { panic("查询token文件失败,请确认使用的fset与解析时一致") } gotSrcPath := tokenFile.Name()
注意
- 必须使用解析阶段同一个
fset实例做查询,新建的空token.FileSet没有存储对应文件的位置映射,调用File()会返回nil- 该方法拿到的路径与你当初传入
ParseFile的第二个参数完全一致,不会自动做路径规范化转换:传入相对路径则返回相对路径,传入绝对路径则返回绝对路径
内容的提问来源于stack exchange,提问作者johnydoey
相关产品推荐
相关产品推荐

