Go使用parser.ParseFile解析源码时如何获取导入包的别名
Go解析AST时获取导入别名的实现方法
f.Imports返回的每个导入项都是*ast.ImportSpec类型,它的Name字段就存着显式声明的导入别名,直接读取这个字段即可拿到test这类自定义别名。
不同导入场景下Name字段的表现:
- 显式别名导入:
Name非空,Name.Name就是你定义的别名,比如示例里的test - 默认无别名导入:
Name为nil,此时别名是包路径最后一段的默认包名 - 点导入(
import . "xxx"):Name.Name值为. - 匿名导入(
import _ "xxx"):Name.Name值为_
修改后的可运行代码逻辑如下:
import ( "fmt" "go/parser" "go/token" "strings" ) func main() { fset := token.NewFileSet() f, err := parser.ParseFile(fset, ".", nil, 0) if err != nil { panic(err) } for _, imp := range f.Imports { // 去掉导入路径前后包裹的双引号 impPath := strings.Trim(imp.Path.Value, `"`) var alias string if imp.Name != nil { // 存在显式声明的别名/点/下划线标识 alias = imp.Name.Name } else { // 无显式声明,取路径最后一段作为默认包名 pathSegs := strings.Split(impPath, "/") alias = pathSegs[len(pathSegs)-1] } fmt.Printf("别名: %s, 路径: %s\n", alias, impPath) } }
运行上述代码处理你给出的test "github.com/username/some-repo"导入声明时,会正确输出别名test。
内容的提问来源于stack exchange,提问作者johnydoey
相关产品推荐
相关产品推荐

