golang 函数以及函数和方法的区别
2017-05-02 17:26
381 查看
http://blog.csdn.net/d_guco/article/details/53575067
在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。
首先函数的格式是固定的,func+函数名+
参数 + 返回值(可选) + 函数体。例
func
main()
{
fmt.Println("Hello
go")
}
在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数),init函数在你导入该package时程序会自动调用init函数,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。
来自CODE的代码片
mypackage.go
来自CODE的代码片
funcmain.go
运行结果:
我们可以看到,程序为我们自动调用了两个init函数,并且是按照顺序调用的。
下面来看方法。
来自CODE的代码片
myint.go
运行结果:
我们可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以重定义基本数据类型。我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平法的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。
这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变累的成员变量
在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。
首先函数的格式是固定的,func+函数名+
参数 + 返回值(可选) + 函数体。例
func
main()
{
fmt.Println("Hello
go")
}
在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数),init函数在你导入该package时程序会自动调用init函数,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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")} |
来自CODE的代码片
mypackage.go
1 2 3 4 5 6 7 8 9 10 | package main import ( "demo/mypackage" "fmt") func main() { fmt.Println("Hello go.... I = ", mypackage.I)} |
来自CODE的代码片
funcmain.go
运行结果:
我们可以看到,程序为我们自动调用了两个init函数,并且是按照顺序调用的。
下面来看方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import "fmt" type myint int //乘2func (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)} |
来自CODE的代码片
myint.go
运行结果:
我们可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以重定义基本数据类型。我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平法的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。
这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变累的成员变量
相关文章推荐
- golang 函数以及函数和方法的详解及区别
- golang 函数以及函数和方法的区别
- 字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- golang---函数定义与方法定义的区别
- GoLang数组初始使用方法以及作为函数参数(1)
- OC中类的函数参数问题,以及方法与函数的区别。
- Golang 中函数和方法的区别
- 1.如何避免野指针2.获取字符串的两种方法。以及malloc,calloc,ralloc的使用注意点3.二维三维数组4.数组和函数的区别
- Golang的时间生成,格式化,以及获取函数执行时间的方法
- [转载]字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- JavaScript的函数call和apply的区别、以及bind方法
- Python: 函数与方法的区别 以及 Bound Method 和 Unbound Method
- Python: 函数与方法的区别 以及 Bound Method 和 Unbound Method
- [转]字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- <Linux>Ubuntu-gcc编译器无法编译sqrt函数和aqrtf函数的解决方法以及sqrt和aqrtf函数的区别
- Python: 函数与方法的区别 以及 Bound Method 和 Unbound Method
- OC中方法与函数的区别以及类的合理设计
- 字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- Scala中apply方法以及函数返回有无unit的区别
- Java中关于==和equal的区别 以及equals()方法重写