Golang 中函數和方法的區別

在接觸到go以前,我認爲函數和方法只是同一個東西的兩個名字而已(在我熟悉的c/c++,python,java中沒有明顯的區別),可是在golang中者徹底是兩個不一樣的東西。官方的解釋是,方法是包含了接收者的函數。到底什麼意思呢。

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

相關文章
相關標籤/搜索