Help us shape the future of Go! Take the 2026 Go Developer Survey

Text file src/cmd/go/testdata/script/list_export_goroot.txt

     1  env GOEXPERIMENT=golistexportnewformat
     2  
     3  # "go list -export" should prefix paths for packages in GOROOT.
     4  go list -export -json fmt
     5  cp stdout out.json
     6  go run q.go out.json Println
     7  stdout '^\$GOROOT'
     8  
     9  # "go list -export" should not prefix paths for packages not in GOROOT.
    10  go list -export -json p.go
    11  cp stdout out.json
    12  go run q.go out.json V
    13  ! stdout '^\$GOROOT'
    14  
    15  -- p.go --
    16  package p
    17  
    18  var V = 42
    19  
    20  -- q.go --
    21  package main
    22  
    23  import (
    24  	"encoding/json"
    25  	"fmt"
    26  	"go/importer"
    27  	"go/token"
    28  	"io"
    29  	"log"
    30  	"os"
    31  )
    32  
    33  func main() {
    34  	data, err := os.ReadFile(os.Args[1])
    35  	if err != nil {
    36  		log.Fatal(err)
    37  	}
    38  	// This is a minimal output of go list -export -json.
    39  	type output struct {
    40  		ImportPath	string
    41  		Export		string
    42  	}
    43  	var out output
    44  	if err := json.Unmarshal(data, &out); err != nil {
    45  		log.Fatal(err)
    46  	}
    47  	fset := token.NewFileSet()
    48  	imp := importer.ForCompiler(fset, "gc", func(path string) (io.ReadCloser, error) {
    49  		if path != out.ImportPath {
    50  			log.Fatalf("unexpected import: %q", path)
    51  		}
    52  		return os.Open(out.Export)
    53  	})
    54  	pkg, err := imp.Import(out.ImportPath)
    55  	if err != nil {
    56  		log.Fatal(err)
    57  	}
    58  	fmt.Println(fset.Position(pkg.Scope().Lookup(os.Args[2]).Pos()).Filename)
    59  }
    60  

View as plain text