Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save deefdragon/2336e2404c468c3c59f1ef670745a920 to your computer and use it in GitHub Desktop.
Save deefdragon/2336e2404c468c3c59f1ef670745a920 to your computer and use it in GitHub Desktop.

tldr: go build only produces an executable for main packages. Check the package name of your main file is main.

I am an idiot. Its only through mistakes that you learn tho. I have recently been running into issues with my new golang projects. ONLY the new ones. Whenever I try to make a new project, it would always have issues. The biggest issue is the fact that "go build" would not produce an executable without "-o main.exe" as arguments. When an executable was produced, if I ran it I got

$ ./main.exe
./main.exe: line 1: syntax error near unexpected token \`newline\'
./main.exe: line 1: \`!<arch>\'

I thought that this was something wrong with my install. Possibly my environmental varaibles. The fact that it was only new projects should have directed me more to how the project was set up. Digging through said vairables proved not to help. Eventually I poked arround the go irc, (far and away the best place to go for help I'd actually go to the golang discord nowadays, but thats personal preference), and finally someone (Thank you neebs) was able to catch what I was doing wrong.

It had been so long since I last created a project, and I had only ever created one mod project from scratch, that I was confusing the errors that I got, and I kept trying to compile the following to an executable.

package lab5
import "fmt"
func main(){
	fmt.Println("Hello World")
}

The issue at hand is the package name. go build only produces an executable for main packages. IE "package main" with a func main().

package main
import "fmt"
func main(){
	fmt.Println("Hello World")
}

Not a mistake I will make again I think.

@mattwelke
Copy link

mattwelke commented Jan 29, 2024

@naddika As @deefdragon said, you don't.

I wanted to suggest the Go docs page Organizing a Go module which does a great job demonstrating how to arrange Go code. It talks about code you don't want to be the entry point of executables (non-main packages) and code you want to be used for making executables (like you were trying to do).

I found this part of the page in particular useful:

Multiple programs in the same repository will typically have separate directories:

project-root-directory/
  go.mod
  internal/
    ... shared internal packages
  prog1/
    main.go
  prog2/
    main.go

In each directory, the program’s Go files declare package main. A top-level internal directory can contain shared packages used by all commands in the repository.

@FangYang970206
Copy link

thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment