ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] 函数是一个固定的程序段,或称其为一个子程序。可重复调用函数内部代码块。 Golang中函数特点: 1. go语言中有3种函数:普通函数、匿名函数(没有名称的函数)、方法(定义在struct上 的函数)。 2. go语言中不允许函数重载(overload),也就是说不允许函数同名。 3. go语言中的函数不能嵌套函数,但可以嵌套匿名函数。 4. 函数是一个值,可以将函数赋值给变量,使得这个变量也成为函数。 5. 函数可以作为参数传递给另一个函数。 6. 函数的返回值可以是一个函数。 7. 函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再将副本传递给函数。 8. 函数参数可以没有名称。 ## 引入 打印9x9乘法口诀表 ```go package main import "fmt" func main() { // i变量作为y轴 for i := 1; i <= 9; i++ { // j变量作为x轴 for j := 1; j <= 9; j++ { // x轴只能小于等于y轴 if j <= i { fmt.Printf("%dx%d=%-2d ", i, j, i*j) } else { // 当大于时,调出for循环。 break } } fmt.Println("") } } ``` 问题一: f:如果某段程序需要重发打印9x9乘法口诀表。可以不可以复制粘贴以上代码打印呢? a:运行肯定没有问题。 问题二: f:请看问题一,运行没有问题。有大量重发代码,能否优化,如何优化? a:可以优化。将代码块搞成函数即可 ## 函数声明 Go语言中定义函数使用func关键字,具体格式如下: ```go /* 函数注释 */ func 函数名(形参1, 形参n) (返回值类型1, 返回值类型n){ 函数体 return 返回值 } ``` 格式解释: - `func` :函数声明关键字,固定不变 - `函数名` :由字母、数字、下划线组成。但函数名的第一个字母不能是数字。**在同一个包内,函数名称不能重名**。当没有名称时,就是匿名函数【可选】 - `参数` :参数由参数变量和参数变量的类型组成,参数变量可以省略,可以有一个参数,也可以有多个,也可以没有;多个参数之间使用,分隔;多个参数时参数变量要么全写,要么全省略;如果多个相邻参数的类型是一样的,可以只保留同一类型最后一个参数的声明。【可选】 - `返回值` :返回值由返回值变量和其变量类型组成,返回值变量可以省略,可以有一个返回值,也可以有多个,也可以没有;多个返回值必须用()包裹,并用,分隔;多个返回值时返回值变量要么全写,要么全省略。【可选】 - `函数体` :实现指定功能的逻辑。 - `return语句` :函数的终止语句。当遇到 return 语句,下面的语句块都不执行。 - `函数注释` :解释函数的功能及说明函数如何使用。**必须是func上面一行,中间不能有空行**。 【可选】 定义一个打印9x9乘法口诀表 ```go func multTable() { for i := 1; i <= 9; i++ { for j := 1; j <= 9; j++ { if j <= i { fmt.Printf("%dx%d=%-2d ", i, j, i*j) } else { break } } fmt.Println("") } } ``` ## 函数调用 定义了函数之后,未调用函数的话。是不会执行函数体里的语句。例如上面的九九乘法口诀表没有在main函数或者其他函数调用的话,就不会打印出来的。 函数调用语法,具体格式如下: ```go // 无参无返回值 函数名() // 有参无返回值 函数名(参数1, 参数n) // 无参有返回值 返回值1, 返回值n := 函数名() // 有参有返回值 返回值1, 返回值n := 函数名(参数1, 参数n) ``` 在 main 函数调用上面定义的九九乘法口诀表函数 ```go func main() { fmt.Println("multTable func begin") // 打印9x9乘法口诀表 multTable() fmt.Println("multTable func end") } ```