函数是程序中存在的一组语句,用于执行特定任务。在高级别上,函数接受输入并返回输出。
函数允许您将常用的代码块提取到单个组件中。
一个最流行的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))
}