六.函数的定义与调用

目录

一.内置函数:

二.标准库函数

三、自定义函数

1、函数定义

2、函数调用

3、函数参数

值传递:

引用传值:

4、函数返回多个值

5、defer语句

6、init函数:


一.内置函数:

Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。

它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用

于系统级的操作,

例如:panic。因此,它们需要直接获得编译器的支持。

在 Windows 下,标准库的位置在Go语言根目录下的子目录

pkg\windows_amd64 中;

在 Linux 下,标准库在Go语言根目录下go env ==》goroot 的子目录

pkg\linux_amd64 中

(如果是安装的是 32 位,则在 linux_386 目录中)。

二.标准库函数

一般情况下,标准包会存放在 $GOROOT/pkg/$GOOS_$GOARCH/ 目录下。

Go语言的标准库以包的方式提供支持,下表列出了Go语言标准库中常见的包及

其功能。

在线标准库: http://www.golang.ltd/

https://studygolang.com/pkgdoc

https://pkg.go.dev/std 官方帮助

三、自定义函数

函数是基本的代码块,用于执行一个任务。

Go 语言最少有1个 main() 函数。

你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称,返回类型和参数。

函数三要素:

1、名称 ==》功能

2、参数 ==》接口

3、返回值 ==》结果

函数分类:

1、内置函数 ==》不需要引用其他模块,直接使用 eg:len()

2、标准库函数 ==》引用第三方模块,或者其他模块,带名称使用

fmt.Println()

3、自定义函数 ==》程序员自行编写,自己调用。

1、函数定义

Go 语言函数定义格式如下:

func function_name ( [parameter list] ) [return_types] {

函数体

}

//parameter形参定义 return_types返回值的类型

eg

func add (a,b int) int {

return a + b

}

函数定义解析:

• func:函数由 func 开始声明

• function_name:函数名称,函数名和参数列表一起构成了函数签名。

注意:首字母大写表示公开函数,首字母小写是私有函数。

• parameter list]:参数列表,参数就像一个占位符,当函数被调用时,你

可以将值传递给参数,

这个值被称为实际参数。参数列表指定的是参数类型、顺序及参数个

数。参数是可选的,

也就是说函数也可以不包含参数。

• return_types:返回类型,函数返回一列值。return_types 是该列值的数

据类型。

有些功能不需要返回值,这种情况下 return_types 不是必须的。

• 函数体:函数定义的代码集合。

实例、以下实例为 max() 函数的代码,

该函数传入两个整型参数 num1 和 num2,并返回这两个参数的最大值:

/* 函数返回两个数的最大值 */ 
func max (num1, num2 int) int{ 
 /* 声明局部变量 */ 
 var result int 
 if (num1 > num2) { 
 result = num1 
 } else { 
 result = num2 
 } 
 return result 
} 

2、函数调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。

调用函数,向函数传递参数,并返回值,例如:

package main

import "fmt"

func main() {

/* 定义局部变量 */

var a int = 100

var b int = 200

var ret int

/* 调用函数并返回最大值 */

ret = max(a, b) // a ,b 实参

fmt.Printf( "最大值是 : %d\n", ret )

}

/* 函数返回两个数的最大值 */

// num1,num2是 形参

func max(num1, num2 int) int {

/* 定义局部变量 */

var result int

if (num1 > num2) {

result = num1

} else {

result = num2

}

return result

}

以上实例在 main() 函数中调用 max()函数,执行结果为:

最大值是 : 200

3、函数参数

函数如果使用参数,该变量可称为函数的形参。

形参就像定义在函数体内的局部变量。

调用函数,可以通过两种方式来传递参数:

值传递:

传递是指在调用函数时将实际参数复制一份传递到函数中,

这样在函数中如果对参数进行修改,将不会影响到实际参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际

参数。

接下来,让我们使用值传递来调用 swap() 函数:

package main 
import "fmt" 
func main() { 
 /* 定义局部变量 */ 
 var a int = 100 
 var b int = 200 
 fmt.Printf("交换前 a 的值为 : %d\n", a ) 
 fmt.Printf("交换前 b 的值为 : %d\n", b ) 
 
/* 通过调用函数来交换值 */ 
 swap(a, b) 
 fmt.Printf("交换后 a 的值 : %d\n", a ) 
 fmt.Printf("交换后 b 的值 : %d\n", b ) 
} 

/* 定义相互交换值的函数 */ 
func swap(x, y int) int { 
 var temp int 
 temp = x /* 保存 x 的值 */ 
 x = y /* 将 y 值赋给 x */ 
 y = temp /* 将 temp 值赋给 y*/ 
 return temp; 
} 

程序中使用的是值传递, 所以两个值并没有实现交互,我们可以使用 引用

传递 来实现交换效果。

引用传值:

引用传递是指在调用函数时将实际参数的地址传递到函数中,

那么在函数中对参数所进行的修改,将影响到实际参数。

引用传递指针参数传递到函数内,以下是交换函数 swap() 使用了引用传

递:

以下我们通过使用引用传递来调用 swap() 函数:

package main

import "fmt"

func main() {

/* 定义局部变量 */

var a int = 100

var b int= 200

fmt.Printf("交换前,a 的值 : %d\n", a )

fmt.Printf("交换前,b 的值 : %d\n", b )

/* 调用 swap() 函数

* &a 指向 a 指针,a 变量的地址

* &b 指向 b 指针,b 变量的地址

*/

swap(&a, &b)

fmt.Printf("交换后,a 的值 : %d\n", a )

fmt.Printf("交换后,b 的值 : %d\n", b )

}

func swap(x *int, y *int) {

var temp int

temp = *x /* 保存 x 地址上的值 */

*x = *y /* 将 y 值赋给 x */

*y = temp /* 将 temp 值赋给 y */

}

4、函数返回多个值

Go 函数可以返回多个值,例如:

package main

import "fmt"

func swap(x, y string) (string, string) {

return y, x

}

func main() {

a, b := swap("Mahesh", "Kumar")

fmt.Println(a, b)

}

以上实例执行结果为:

Kumar Mahesh

5、defer语句

Go语言中的defer语句会将其后面跟随的语句进行延迟处理

在defer所属的函数即将返回时,将延迟处理的语句按照defer定义的顺序逆序执行,即先进后出

package main 
import "fmt" 
func main() { 
fmt.Println("开始") 
defer fmt.Println(1) 
defer fmt.Println(2) 
defer fmt.Println(3) 
fmt.Println("结束") 
} 

以上代码执行结果如下

开始

结束

3

2

1

6、init函数:

每一个源文件都可以包含一个init函数,该函数会在main函数执行前,

被go框架调用,也就是说init()函数会在main()函数之前执行。

执行结果:

练习:

1、编写一个函数,完成两个数字的加法运算,并将结果返回。

2、编写函数完成 统计一段字符串,中文,英文字母,数字,空格,出现的次数:

3、编写 检测回文(中文) 函数

猜你喜欢

转载自blog.csdn.net/m2282475145/article/details/131199778