Go语言中的函数和方法是两个完全不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢?
首先,函数的格式是固定的,func + 函数名 + 入参(可选) + 返回值(可选) + 函数体。 例如
func main() {fmt.Println("Hello World!")}
在golang中有两个特殊的函数,main函数和init函数
main函数作为一个程序的入口,只能有一个。
init函数在每个package是可选的,可有可无,甚至可以有多个,init函数在你导入该package时程序会自动调用init函数,另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。值得注意的是init函数没有入参和返回值。
package mypackageimport "fmt"var I intfunc init() {I = 0fmt.Println("Call mypackage init1")}func init() {I = 1fmt.Println("Call mypackage init2")}// ======================package mainimport ("mypackage""fmt")func main() {fmt.Println("Hello go.... I = ", mypackage.I)}// >>>>>>>>>> output <<<<<<<<<<// Call mypackage init1// Call mypackage init2// Hello go.... I = 1// 程序自动调用了两个init函数,并且是按照顺序调用的。
下面这个例子可以看出方法和函数的区别:
方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至可以重定义基本数据类型。
这里需要注意一个细节,接收者是指针和非指针(值)的区别,我们可以看到当接收者为指针时,我们可以通过方法改变该接收者的属性,但是非指针类型却做不到。
这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变累的成员变量。
因此可以得出,函数没有固定的所属,而方法属于固定的接收者类型。
package mainimport "fmt"type myint intfunc (p *myint) mydouble() int {*p = *p * 2return 0}func (p myint) mysquare() int {p = p * pfmt.Println("mysquare p = ", p)return 0}func main() {var i myint = 2i.mydouble()fmt.Println("i = ", i)i.mysquare()fmt.Println("i = ", i)}// >>>>>>>>>> output <<<<<<<<<<// i = 4// mysquare p = 16// i = 4
