首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体。例 java
func main() { fmt.Println("Hello go") }
在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在全部语言中都同样,它做为一个程序的入口,只能有一个。init函数在每一个package是可选的,无关紧要,甚至能够有多个(可是强烈建议一个package中一个init函数),init函数在你导入该package时程序会自动调用init函数,因此init函数不用咱们手动调用,l另外它只会被调用一次,由于当一个package被屡次引用时,它只会被导入一次。python
package mypackage import ( "fmt" ) var I int func init() { I = 0 fmt.Println("Call mypackage init1") } func init() { I = 1 fmt.Println("Call mypackage init2") }
package main import ( "demo/mypackage" "fmt" ) func main() { fmt.Println("Hello go.... I = ", mypackage.I) }
运行结果:c++
咱们能够看到,程序为咱们自动调用了两个init函数,而且是按照顺序调用的。golang
下面来看方法。函数
package main import "fmt" type myint int //乘2 func (p *myint) mydouble() int { *p = *p * 2 return 0 } //平方 func (p myint) mysquare() int { p = p * p fmt.Println("mysquare p = ", p) return 0 } func main() { var i myint = 2 i.mydouble() fmt.Println("i = ", i) i.mysquare() fmt.Println("i = ", i) }
运行结果:this
咱们能够看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者能够是本身定义的一个类型,这个类型能够是struct,interface,甚至咱们能够重定义基本数据类型。咱们能够给他一些咱们想要的方法来知足咱们的实际工程中的需求,就像上面同样我重定义了int并给了它一个乘2和平法的方法,这里咱们要注意一个细节,接收者是指针和非指针的区别,咱们能够看到当接收者为指针式,咱们能够经过方法改变该接收者的属性,可是非指针类型缺作不到。spa
这里的接收者和c++中的this指针有一些类似,咱们能够把接受者看成一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能经过此方法改变累的成员变量。指针