I started a project in Go, when I got started everything was in a single file. Now this file is too big for my own taste, so I split it into 2 separate files, let’s call them main.go & util.go. In main.go I have the main() function, in util.go I have functions used by main.go.

When I tried to run main.go directly I got this error:

$ go run main.go
# command-line-arguments
./main.go:150: undefined: SomeFunction

I didn’t want to create a package just for util.go, sometime source files really are specific to a program and aren’t reusable.

My search for a solution on the web didn’t yield anything useful. I knew it was possible, I saw programs like godeb do it. After a while I built the program with go build to see if the error would be different, and it worked this time. Weird… What’s going on?

Everything was the same except I didn’t specify what to build, in that case main.go. Go just built every go source files in the directory, I got the same error with go build with only main.go specified.

$ go build main.go
# command-line-arguments
./main.go:150: undefined: SomeFunction

That’s when it hit me, I just needed to list all the files necessary to run the program on the command line:

$ go run main.go util.go

Here it is: go run needs the complete list of files to execute in the main package. I’ll know it for next time!