Go的函数和Python的函数有许多相似的地方,两者都支持变长函数,支持返回多个返回值。但是Golang作为静态编译型语言在语法上相比Python而言更加的严谨一些,这个也无可厚非了。
两者最大的区别在我看来是Python是面向对象的语言,它是有类这个概念的,所以在Python中函数就是方法,这两者没有本质的区别。但是由于Golang不是面向对象语言,没有类的这个概念,所以Go的类需要使用结构体来实现。因此在Go中有结构体绑定的函数叫方法,这个和别的语言是有区别的。
Go规定如果需要被导出的函数,即可以被外部包访问调用的函数,函数名首字母英文大写,反之亦然。
一个完整的函数声明结构格式如下:
func funcName(input type1, input2 type2) (output1 type1, output2 type2) {
// 逻辑代码
return value1, value2 // 返回多值
}
普通函数
// 返回两数之和
func muti(x, y int) int {
return x * y
}
注意:如果函数参数中多个参数类型相等,可以将类型省略。
// 交换两参数
func swap(x, y string) (string, string) {
return y, x
}
参数变长函数
func strJoin(str ...string) string {
return strings.Join(str, "==")
}
目前来说,Go中的变长参数只能是同一种类型,否则编译会报错。
匿名函数和闭包
// 匿名函数
max := func(x, y int) int {
if x > y {
return x
}
return y
}
// 闭包
func countRecord() func() int {
i := 0
return func() int {
i++
return i
}
}
使用结构体实现“类”
因为Go没有类的概念,需要通过结构体的函数绑定来实现类的功能,而此时函数也不叫函数了,在这里应该叫方法。
package main
import (
"fmt"
)
type Rectangle struct {
length float32
width float32
}
func main() {
var r Rectangle
r.width = 12
r.length = 24
fmt.Printf("面积为:%f", r.getArea())
}
func (r Rectangle) getArea() float32 {
return r.length * r.width
}
总结
Go的函数形式只有这么几种的话那也太平平无奇了,事实上Go语言函数还有很多比较先进的思想,例如多返回值、延迟语句,Panic异常可Recover异常捕获...这些函数特点可以更高效的编写Go语言的函数。
更高阶的用法需要等到后期我对概念更加理解之后再来分享,这篇文章仅仅用来记录学习过程。

JinF
冲冲冲!