什么规则决定Go软件包的安装位置?

When I run go install with some of my own package located in %GOPATH%\src, it will be installed to %GOPATH%\pkg.

I read that %GOROOT% and %GOPATH% folders have similar organization. So I tried go install cmd\cgo with the %GOROOT%\src\cmd\cgo package which is part of the golang installation. But the final cgo.exe is installed to %GOROOT%\pkg\tool\.

I checked all the *.go files in the cmd\cgo folder. They all have a package main declaration. So I was expecting the final cgo.exe to be installed to %GOROOT%\bin.

My questions are:

  • Why the cgo.exe is installed to pkg rather than bin?
  • Where does the tool part in the pkg\tool come from? Can I do similar thing for my own package?

The go build command relies on a go tool directory, where build tools are installed (compile.exe, link.exe, ...).

And ToolDir is defined as:

var ToolDir = filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)

So any build tool is in %GOROOT%\pkg\tool\