函数是编程语言的一个基本的代码块,逻辑上用于执行一些特定任务。函数是代码重用的最基本的例子,它把程序中一些频繁使用的操作抽取出来组成一个独立的代码快,通过函数调用来避免重复编写这部分代码。

函数

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语言以函数作为基本组织单位,因此,全局变量指的是函数外部的变量,全局变量可以在整个包甚至外部包中中的任何函数中使用。

形式参数

形参相当于一个占位符,它的值由实参指定。从作用域上来讲,形参属于局部变量。

你可以这么记忆,花括号内的变量仅在花括号内它被定义后有效,被称为局部变量。这在所有语言中都是通用的。