Function Golang中的函数声明

Function Golang中的函数声明,function,go,Function,Go,在Golang中声明函数似乎有两种不同的方式,如下所示: package main import "fmt" var someFunc = func(arg string) { fmt.Println(arg) } func main() { someFunc("Hello") } somefunc := func(arg string) {} 以上工作。但是,以下方法不起作用: package main import "fmt" var someFunc = func(ar

在Golang中声明函数似乎有两种不同的方式,如下所示:

package main
import "fmt"
var someFunc = func(arg string) {
    fmt.Println(arg)
}
func main() {
    someFunc("Hello")
}
somefunc := func(arg string) {}
以上工作。但是,以下方法不起作用:

package main
import "fmt"
var someFunc = func(arg string) {
    fmt.Println(arg)
}
var main = func() {
    someFunc("Hello")
}
它将抱怨:

runtime.main: undefined: main.main
那么
func-someFunc()
var-someFunc=func()
之间有什么区别呢

我发现这可能是因为我也编写了很多Javascript代码。似乎在Go中,我很少看到有人声明像
var someFunc=func()
这样的函数。在这两者中,我们能说哪一个比另一个更正确吗

func main() {
这是在声明一个名为
main
的函数

var main = func() {
这是声明一个匿名函数并将其分配给名为main的变量。函数是Go中的一流数据。您可以将函数本身分配给变量。

当您这样做时

var someFunc = func(arg string) {}
您正在为
somefunc
变量分配一个匿名函数。你也可以这样写:

package main
import "fmt"
var someFunc = func(arg string) {
    fmt.Println(arg)
}
func main() {
    someFunc("Hello")
}
somefunc := func(arg string) {}
创建函数的另一种方法是创建命名函数:

func somefunc(arg string) {}
命名函数只能在顶层声明,而匿名函数可以在任何地方声明。而
main
有一个特殊的含义,在
main
包中必须有一个名为
main
的命名函数,这就是第二种情况下出现错误的原因。

这是一个错误

这是一个

报告说:

“主程序包必须具有程序包名称main并声明函数 不接受参数且不返回值的main。“


变量声明不是函数声明,因此不符合main的要求。

这是抱怨,因为所有函数都必须在作为程序起点的main函数内调用

例:


func-somefunc(arg-string){}
是否有效地创建了
somefunc
变量?如果是这种情况,它们之间是否有显著差异?不,它不会创建一个变量,因此它们是不同的。但我可以用两种方式执行
fmt.Println(someFunc)
。它们都打印出函数的内存地址。调用可以作为变量传递给fmt.Println的东西在技术上是否不正确?以下是规范中关于和的内容。它们是不同的,但区别很小,因为函数是Go中的一级数据。您可以在运行时将不同的函数分配给
var f=func(){}
,但不能分配给
func f(){}
。这意味着编译器可以在编译时内联
func f()?如果是这种情况,它们之间是否存在显著差异?否。在第一种情况下,尝试将其他内容分配给
main
将是错误的。在第二种情况下可以。
package main

import "fmt"

func Print() {

    fmt.Println("Print function")
}

func main() {

    Print()

}