函数是程序中存在的一组语句,用于执行特定任务。在高级别上,函数接受输入并返回输出。

函数允许您将常用的代码块提取到单个组件中。

一个最流行的Go函数是main(),它在每个独立的Go程序中都有使用。

 

创建函数

声明以func关键字开头,后跟希望函数具有的名称、一对括号(),然后是包含函数代码的块。

下面的示例具有一个名为SimpleFunction的函数。它不带任何参数,也不返回任何值。

package main

import "fmt"

// SimpleFunction prints a message
func SimpleFunction() {
	fmt.Println("Hello World")
}

func main() {
	SimpleFunction()
}
Hello World

 

使用参数的简单函数

信息可以通过参数传递给函数。参数就像一个变量。

参数在函数名称之后的括号内指定。您可以根据需要添加任意数量的参数,只需用逗号分隔即可。

下面的示例有一个函数,其中包含两个 int 类型的参数。当调用add()函数时,我们传递两个整数值,例如(20,30)。

package main

import "fmt"

// Function accepting arguments
func add(x int, y int) {
	total := 0
	total = x + y
	fmt.Println(total)
}

func main() {
	// Passing arguments
	add(20, 30)
}

输出

50

如果名称以大写字母开头的函数将导出到其他包。如果函数名称以小写字母开头,则不会将其导出到其他包,但可以在同一包中调用此函数。

 

具有返回值的简单函数

在此示例中,add()函数接受两个整数的输入,并返回一个名称为 total 的整数值。

请注意,当返回值声明为函数签名的一部分时,需要 return 语句。

package main

import "fmt"

// Function with int as return type
func add(x int, y int) int {
	total := 0
	total = x + y
	return total
}

func main() {
	// Accepting return value in varaible
	sum := add(20, 30)
	fmt.Println(sum)
}

输入和返回值的类型必须与函数签名匹配。如果我们修改上面的程序并在参数中传递一些字符串值,那么程序将抛出一个异常。

 

声明函数的返回值

Golang允许您命名函数的返回值。我们还可以通过定义变量来命名返回值,这里在函数声明中为函数返回的值定义了整数类型的变量总数

package main

import "fmt"

func rectangle(l int, b int) (area int) {
	var parameter int
	parameter = 2 * (l + b)
	fmt.Println("Parameter: ", parameter)

	area = l * b
	return // Return statement without specify variable name
}

func main() {
	fmt.Println("Area: ", rectangle(20, 30))
}

输出

Parameter:  100
Area:  600

由于函数声明为返回int类型的值,因此执行流中的最后一个逻辑语句必须是返回所声明类型的值的return语句。

 

返回多个值的函数

Golang 中的函数可以返回多个值,这在许多实际场景中是一个有用的功能。

此示例声明一个具有两个返回值的函数,并从 main 函数调用它。

package main

import "fmt"

func rectangle(l int, b int) (area int, parameter int) {
	parameter = 2 * (l + b)
	area = l * b
	return // Return statement without specify variable name
}

func main() {
	var a, p int
	a, p = rectangle(20, 30)
	fmt.Println("Area:", a)
	fmt.Println("Parameter:", p)
}

 

函数的命名约定

  • 名称必须以字母开头,并且可以包含任意数量的其他字母和数字。
  • 函数名称不能以数字开头。
  • 函数名称不能包含空格。
  • 如果名称以大写字母开头的函数将导出到其他包。如果函数名称以小写字母开头,则不会将其导出到其他包,但可以在同一包中调用此函数。
  • 如果名称由多个单词组成,则第一个单词之后的每个单词都应大写,如下所示:empName,EmpAddress等。
  • 函数名称区分大小写(CAR、Car 和 CAR 是三个不同的变量)。

 

将引用传递给函数

将变量的引用传递给函数,并在函数主体内使用取消引用修改变量的值。

package main

import "fmt"

func update(a *int, t *string) {
	*a = *a + 5      // defrencing pointer address
	*t = *t + " Doe" // defrencing pointer address
	return
}

func main() {
	var age = 20
	var text = "John"
	fmt.Println("Before:", text, age)

	update(&age, &text)

	fmt.Println("After :", text, age)
}

输出

Before: John 20
After : John Doe 25

 

匿名函数

匿名函数是声明的函数,没有任何命名标识符来引用它。匿名函数可以接受输入和返回输出,就像标准函数一样。

为变量赋值函数。

package main

import "fmt"

var (
	area = func(l int, b int) int {
		return l * b
	}
)

func main() {
	fmt.Println(area(20, 30))
}

将参数传递给匿名函数。

package main

import "fmt"

func main() {
	func(l int, b int) {
		fmt.Println(l * b)
	}(20, 30)
}

函数定义为接受参数和返回值。

package main

import "fmt"

func main() {
	fmt.Printf(
		"100 (°F) = %.2f (°C)\n",
		func(f float64) float64 {
			return (f - 32.0) * (5.0 / 9.0)
		}(100),
	)
}

匿名函数可用于包含不需要命名的功能,并且可能用于短期使用。

 

闭包功能

闭包是匿名函数的特例。闭包是匿名函数,用于访问在函数主体外部定义的变量。

访问主体外部定义的变量的匿名函数。

package main

import "fmt"

func main() {
	l := 20
	b := 30

	func() {
		var area int
		area = l * b
		fmt.Println(area)
	}()
}

在函数体内的循环的每次迭代中访问变量的匿名函数。

package main

import "fmt"

func main() {
	for i := 10.0; i < 100; i += 10.0 {
		rad := func() float64 {
			return i * 39.370
		}()
		fmt.Printf("%.2f Meter = %.2f Inch\n", i, rad)
	}
}

 

高阶函数

高阶函数是接收函数作为参数或返回函数作为输出的函数。

高阶函数是对其他函数进行操作的函数,方法是将它们作为参数或返回它们。

 

将函数作为参数传递给其他函数

package main

import "fmt"

func sum(x, y int) int {
	return x + y
}
func partialSum(x int) func(int) int {
	return func(y int) int {
		return sum(x, y)
	}
}
func main() {
	partial := partialSum(3)
	fmt.Println(partial(7))
}

输出

10

在上面的程序中,partialSum函数返回一个sum函数,该函数接受两个int参数并返回一个int参数。

 

从其他函数返回函数

package main

import "fmt"

func squareSum(x int) func(int) func(int) int {
	return func(y int) func(int) int {
		return func(z int) int {
			return x*x + y*y + z*z
		}
	}
}
func main() {
	// 5*5 + 6*6 + 7*7
	fmt.Println(squareSum(5)(6)(7))
}

输出

110

在上面的程序中,squareSum函数签名指定该函数返回两个函数和一个整数值。

 

用户定义函数类型

Golang还支持定义我们自己的函数类型。

上述程序的修改版本,功能类型如下:

package main

import "fmt"

type First func(int) int
type Second func(int) First

func squareSum(x int) Second {
	return func(y int) First {
		return func(z int) int {
			return x*x + y*y + z*z
		}
	}
}

func main() {
	// 5*5 + 6*6 + 7*7
	fmt.Println(squareSum(5)(6)(7))
}