Even though I have GOPATH properly set, I still can't get "go build" or "go run" to find my own packages. What am I doing wrong? Thank you so much!
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
It does not work because your
foobar.go
source file is not in a directory calledfoobar
.go build
andgo install
try to match directories, not source files.$GOPATH
to a valid directory, e.g.export GOPATH="$HOME/go"
foobar.go
to$GOPATH/src/foobar/foobar.go
and building should work just fine.Additional recommended steps:
$GOPATH/bin
to your$PATH
by:PATH="$GOPATH/bin:$PATH"
main.go
to a subfolder of$GOPATH/src
, e.g.$GOPATH/src/test
go install test
should now create an executable in$GOPATH/bin
that can be called by typingtest
into your terminal.TL;DR: Follow Go conventions! (lesson learned the hard way), check for old go versions and remove them. Install latest.
For me the solution was different. I worked on a shared Linux server and after verifying my
GOPATH
and other environment variables several times it still didn't work. I encountered several errors including 'Cannot find package' and 'unrecognized import path'. After trying to reinstall with this solution by the instructions on golang.org (including the uninstall part) still encountered problems.Took me some time to realize that there's still an old version that hasn't been uninstalled (running
go version
thenwhich go
again... DAHH) which got me to this question and finally solved.Edit: since you meant GOPATH, see fasmat's answer (upvoted)
As mentioned in "How do I make go find my package?", you need to put a package
xxx
in a directoryxxx
.See the Go language spec:
The Code organization mentions:
(a "workspace" is a path entry in your
GOPATH
: that variable can reference multiple paths for your 'src, bin, pkg
' to be)(Original answer)
You also should set
GOPATH
to ~/go, notGOROOT
, as illustrated in "How to Write Go Code".That is different from
GOROOT
:Have you tried adding the absolute directory of go to your 'path'?