首先函數的格式是固定的,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成員函數,不能經過此方法改變累的成員變量。指針