函数是编程语言的一个基本的代码块,逻辑上用于执行一些特定任务。函数是代码重用的最基本的例子,它把程序中一些频繁使用的操作抽取出来组成一个独立的代码快,通过函数调用来避免重复编写这部分代码。
函数
Go语言中没有类这个概念,因此函数就成了它最基本的组织单位。Go语言中函数的基本概念同其他编程语言。
main()
Go语言标准库中提供了广泛的内置函数,这里介绍的主要是自定义函数。
函数定义语法如下:
func function_name([parameter list]) [return_types] {
// function body
}
- func
函数声明关键字 - function_name
函数名称,自定义,命名规则同变量命名规则 - parameter_list
参数列表:参数类型、顺序、参数个数,可选 - return_types
返回类型,注意加了s,Go的函数允许多个返回值,因此需要指定多个返回类型
注:Go语言中允许将函数作为参数传递及将函数作为返回值。这一点同Python,这是实现闭包的基础。
函数调用使用函数名,并传入实参即可。
实例:
package main
import "fmt"
func max(n1, n2 int) int {
if n1 > n2 {
return n1
} else {
return n2
}
}
func main() {
fmt.Print(max(4, 8))
}
函数参数传递包括值传递和引用传递等概念,这一点上Go和其他语言一致。默认情况下,Go语言使用值传递。
递归函数
递归指的是一个函数不断调用自身。尾递归指的是在return 语句中递归调用自身。在一些没有循环的编程语言中,使用尾递归来实现循环。
Go语言支持递归。
实例(斐波那契数列,尾递归):
func fibonacci(n int) int {
if n < 2 {
return n
}
return fibonacci(n-2) + fibonacci(n-1)
}
方法
方法其实是属于面向对象的一个概念,类中的函数被称作方法。
Go语言中没有类,但也有方法这个概念。
Go语言中的方法指的是包含了接受者的函数,接收者可以是命名类型或者结构体的一个值或者指针。所有给定类型的方法都属于该类型的方法集。
方法的定义和函数定义是不一样的,语法如下:
func (variable_name, variable_data_type) function_name() [return_type] {
// method body
}
下面这个实例来自菜鸟教程:
package main
import (
"fmt"
)
/* 定义结构体 */
type Circle struct {
radius float64
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
// 圆的面积 = 314
变量的作用域
具备以上概念之后,我们就可以讨论变量的作用域了。
作用域表示已经声明的变量它再源代码中起作用的范围。
- 函数内部定义的变量称为局部变量
- 函数外部定义的编程称为全局变量
- 函数定义中的变量称为形式参数
局部变量
因为Go语言以函数作为基本组织单位,因此,局部变量指的是函数内部的变量,局部变量仅在函数体内有效。
全局变量
因为Go语言以函数作为基本组织单位,因此,全局变量指的是函数外部的变量,全局变量可以在整个包甚至外部包中中的任何函数中使用。
形式参数
形参相当于一个占位符,它的值由实参指定。从作用域上来讲,形参属于局部变量。
你可以这么记忆,花括号内的变量仅在花括号内它被定义后有效,被称为局部变量。这在所有语言中都是通用的。