持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
一、函数简介
1.1 何为函数
为完成某一功能的程序指令(语句)的集合,称为函数。在Go中,函数分为:自定义函数、系统函数(查看Go编程手册)
1.2 使用函数的优点
- 减少代码冗余
- 便于维护
1.3 基本语法
func 函数名 ( 形参列表 ) (返回值列表){
代码块
......
return 返回值列表
}
- 形参列表: 表示函数的输入
- return 可以有也可以没有
二、函数案例
定义并使用一个计算功能的函数
package main
import "fmt"
func calc(num1 float64, num2 float64, operator byte) float64 {
var res float64
switch operator {
case '+':
res = num1 + num2
case '-':
res = num1 - num2
case '*':
res = num1 * num2
case '/':
res = num1 / num2
default:
fmt.Println("操作符输入有误,请重新输入.....")
}
return res
}
func main() {
var num1 float64 = 100.86
var num2 float64 = 100.10
var operator byte = '+'
result := calc(num1, num2, byte(operator))
fmt.Printf("计算结果为: %v", result)
}
三、包的引出和使用
3.1 包简介
包的本质实际上就是创建不同的文件夹,来存放程序文件
3.2 包的三大作用
- 区分相同名字的函数、变量等标识符
- 当程序文件很多时,可以很好的管理项目
- 控制函数、变量等访问范围,即作用域
3.3 打包基本语法
package 包名
3.4 引入包的基本语法
import "包的路径"
3.5 包的快速入门案例
3.5.1 案例演示文件结构
- src/go
- main
- main.go
- utils
- utils.go
- main
3.5.2 定义utils.go中的函数
package utils
import "fmt"
// 计算函数
func calc(num1 float64, num2 float64, operator byte) float64 {
var res float64
switch operator {
case '+':
res = num1 + num2
case '-':
res = num1 + num2
case '*':
res = num1 + num2
case '/':
res = num1 + num2
default:
fmt.Println("操作符输入错误,请重新输入........")
}
return res
}
3.5.3 在main函数中调用
package main
import (
"fmt"
"go_code/chapter12/utils"
)
func main() {
var num1 float64 = 100.86
var num2 float64 = 100.10
var operator byte = '+'
result := utils.Calc(num1, num2, operator)
fmt.Printf("%v %c %v = %v", num1, operator, num2, result)
}
3.6 包的注意事项
- 在给一个文件打包时,该包对应一个文件夹,比如这里的utils 文件夹对应的包名就是utils,文件的包名通常和文件所在的文件夹名一致,一般为小写字母。
- 当一个文件要使用其它包函数或变量时,需要先引入对应的包
- 引入方式1: import "包名"
- 引入方式2:
import (
"包名"
"包名"
)
- package指令在文件第一行,然后是import指令。
- 在import包时,路径从$GOPATH的src下开始, 不用带src,编译器会自动从src 下开始引入
- 为了让其它包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的public,这样才能跨包访问。比如utils.go 的
- 在访问其它包函数,变量时,其语法是包名.函数名,比如这里的main.go文件中
- 如果包名较长,Go支持给包取别名,注意细节:取别名后,原来的包名就不能使用了
import uts "go_code/chapter12/utils"
uts.Calc(num1, num2, operator)
- 在同一包下,不能有相同的函数名(也不能有相同的全局变量名),否则报重复定义
- 如果你要编译成一个可执行程序文件,就需要将这个包声明为main, 即package main .这个就是一个语法规范,如果你是写一个库,包名可以自定义。
放在bin目录
// 运行命令
先进入gopath的位置,然后执行命令
go build -o bin/calc.exe go_code/xxx/main
四、函数的调用机制
4.1 案例演示一
package main
import "fmt"
// 此处形参 num1
func add(num1 int) {
num1 += 1
fmt.Println("num1 = ", num1)
}
func main() {
num1 := 10
// 调用add
// 传入实参 num1:=10
add(num1)
// 打印的是num1,没有经过add()函数加工
fmt.Println("num1 = ", num1)
}
- (1)在调用- -个函数时,会给该函数分配一-个新的空间,编译器会通过自身的处理让这个新的空间和其它的栈的空间区分开来
- (2)在每个函数对应的栈中,数据空间是空间的,不会混淆
- (3)当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间。
4.2 案例演示二(函数返回)
package main
import "fmt"
func sumNums(num1 int, num2 int) int {
sum := num1 + num2
fmt.Println("总和为: ", sum)
return sum
}
func main() {
num1 := 10
num2 := 20
// 调用sumNums
// 将实参 num1:=10,num2:=20 传入
// 调用sumNums函数会打印出总和,并且返回 sum的值
// 使用变量sum 接收 sumNums中的返回值
// 注意此处的sum 和 sumNums的 sum 并不是同一个
sum := sumNums(num1, num2)
fmt.Println("sum = ", sum)
}
五、 return语句
5.1 return 基本语法
func 函数名(形参列表) (返回值类型列表){
代码块
return 返回值列表
}
- 如果返回多个值时,在接收时,希望忽略某个返回值,则使用_符号 表示占位忽略
- 如果返回值只有一个(返回值类型列表) 可以不写()
5.2 案例演示(多返回值)
package main
import "fmt"
func sumAndsub(num1 int, num2 int) (int, int) {
sum := num1 + num2
sub := num1 - num2
return sum, sub
}
func main() {
num1 := 10
num2 := 20
// 调用sumAndsub
sum, _ := sumAndsub(num1, num2)
_, sub := sumAndsub(num1, num2)
fmt.Println("sum = ", sum)
fmt.Println("sub = ", sub)
}