Having multiple main functions on Go

Issue

As a Python and Django developer, I can run any piece of code in my project using a script independently.

I am not too sure how to achieve the same thing in Go, as it looks like each Go project should only have one main executable file.

I’d like to call a function in my project from cronjob, but I’m not too sure how to add that. Using flags in my main function is the only way I can think of doing this. But it will look pretty confusing if my script accepts additional flags by itself like the following:

go run server.go --debug --another-flag --script-name <MY-SCRIPT> --my-script-flag-one <FLAG-ONE> --my-script-flag-two <FLAG-TWO>

Is there any elegant way of doing this?

Solution

I reference in "What is a sensible way to layout a Go project" the article "Structuring Applications in Go", which shows as an example the project perkeep.
That project includes several cmd packages, each with their own set of options.

The other option would be to use a CLI interface library like spf13/cobra, which allows you to define several commands (same exe, separate sets of options).

Command is the central point of the application.
Each interaction that the application supports will be contained in a Command.
A command can have children commands and optionally run an action.

In the example "hugo server --port=1313", ‘server‘ is the command

A Command has the following structure:

type Command struct {
    Use string // The one-line usage message.
    Short string // The short description shown in the 'help' output.
    Long string // The long message shown in the 'help <this-command>' output.
    Run func(cmd *Command, args []string) // Run runs the command.
}

Answered By – VonC

Answer Checked By – David Marino (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.