在接触到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成员函数,不能经过此方法改变累的成员变量。指针