go run: cannot run non-main package

GoGoogle App-Engine-Go

Go Problem Overview


here the simple go application. I am getting "go run: cannot run non-main package" error, if I run following code.

package zsdfsdf

import (
	"fmt"
)

func Main() {
	fmt.Println("sddddddd")
}

To fix it, I just need to name the package to main. But I don't understand why I need to do that. I should be able to name the package whatever I want.

Another question, I know main function is the entry point of the program, you need it. otherwise it will not work. But I see some codes that didn't have main function still works.

Click on this link, the example at the bottom of the page didn't use package main and main function, and it still works. just curious why.

https://developers.google.com/appengine/docs/go/gettingstarted/usingdatastore

Go Solutions


Solution 1 - Go

The entry point of each go program is main.main, i.e. a function called main in a package called main. You have to provide such a main package.

GAE is an exception though. They add a main package, containing the main function automatically to your project. Therefore, you are not allowed to write your own.

Solution 2 - Go

You need to use the main package, a common error starting with go is to type

package Main

instead of

package main

Solution 3 - Go

You need to specify in your app.yaml file what your app access point is. Take a look here. You need to specify:

application: zsdfsdf

Also see from that above link: > "Note: When writing a stand-alone Go program we would place this code > in package main. The Go App Engine Runtime provides a special main > package, so you should put HTTP handler code in a package of your > choice (in this case, hello)."

You are correct that all Go programs need the Main method. But it is provided by Google App Engine. That is why your provided example works. Your example would not work locally (not on GAE).

Solution 4 - Go

A Solution to avoid this error is defining entry point somefilename.go file as main package by adding package main as the first line of the entry point

package main

// import statements 
import "fmt"

// code below

Solution 5 - Go

To avoid the problem you can modify the code as follow

package main

import (
    "fmt"
 )

func main() {
    fmt.Println("sddddddd")
 }

rename the package as "main" and rename the function as "main" instead of "Main".

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionqinking126View Question on Stackoverflow
Solution 1 - Gotux21bView Answer on Stackoverflow
Solution 2 - GoPablo CegarraView Answer on Stackoverflow
Solution 3 - GoSam PView Answer on Stackoverflow
Solution 4 - GoAll Іѕ VаиітyView Answer on Stackoverflow
Solution 5 - GoKanchan SarkarView Answer on Stackoverflow