核心化编程
为什么需要函数?
- 代码冗余问题
- 不利于代码维护
- 函数可以解决这个问题
函数
函数:为完成某一功能的程序指令(语句)的集合,称为函数
在 Go 中,函数分为:自定义函数(自己写的)、系统函数(系统提供的)
函数的定义
基本语法:
func 函数名(形参列表) (返回值列表) {
执行语句...
return 返回值列表
}
- 形参列表:表示函数的输入
- 函数中的语句:表示为了实现某一功能代码块
- 函数可以有返回值,也可以没有
包
包的引入:
- 在实际开发中,我们往往需要在不同的文件中,去调用其他文件的定义的函数,比如在 main.go 中,去使用 utils.go 文件中的函数,如何实现?——》包
- 现在有两个程序员共同开发一个 Go 项目,程序员A 希望定义函数 cal,程序员B 也想定义函数 cal,两个程序员吵起来了,怎么办?——》包
包的原理图
包的本质实际上就是创建不同的文件夹,来存放程序文件
包的介绍
包的概念:
说明:go 的每一个文件都是属于一个包的,也就是说 go 是以包的形式来管理文件和项目目录结构的
包的三大作用:
- 区分相同名字的函数,变量等标识符
- 当程序文件很多时,可以很好的管理项目
- 控制函数、变量等访问范围,即作用域
包的相关说明:
- 打包基本语法
- package util
- 引入包的基本语法
- import "包的路径"
包的快速入门:
说明:包的快速入门——》Go 相互调用函数
使用包里面的函数
包名.函数名( )
包的注意事项和细节说明:
- 在给一个文件打包时,该包对应一个文件夹,比如这里的 utils 文件夹对应的包名就是 utils,文件的包名 通常 和文件所在的文件夹名一致,一般为小写字母
- 当引入一个文件要使用其它包函数或变量时,需先引入对应的包
- 引入方式1:import "包名"
- 引入方式2: import ( "包名")(和引入fmt 一样)
- package 指令在文件第一行,然后是 import 指令
- 在 import 包时,路径从 $GOPATH 的 src 下开始,不用带 src ,编译器会自动从 src 下开始引入
- 为了让其他包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言的 public,这样才可以跨包访问。(比如 untils.go )
- 在访问其他包函数时,其语法是: 包名。函数名
- 如果包名较长,Go 语言支持给包取别名。注意细节:取别名后,原来的包名就不能使用了。说明:如果给包取了别名,则需要使用别名来访问该包的函数和变量
- 在同一个包下,不能有相同的函数名(也不能有相同的全局变量),否则报重复定义错误
- 如果你要编译成一个可执行程序文件,就需要将这个包声明为 main,即 package main。这个就是一个语法规范,包名可以自定义
- 编译时需要编译 main 包所在的文件夹
- 可以指定生产的可执行文件名 .exe,放在指定路径
- go build -o bin\my.exe 后面时mian.go所在的路径
- -o 代表输出
- 当编译完会生成一个 pkg 文件,里面是库包 .a(里面是二进制)
函数的调用机制
- 在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的空间和其他的栈的空间区分开来
- 在每个函数对应的栈中,数据空间是独立的,不会混淆
- 当一个函数调用完毕(执行完毕)后程序会销毁这个函数对应的栈空间。
return 语句
基本语法
Go 函数支持返回多个值,这一点是其他编程语言没有的
func 函数名(形参列表) (返回值列表) { 语句... return 返回值列表 }
- 如果返回多个值时,在接收时,希望忽略某个返回值,则使用 _ 符号表示占位忽略
- 如果返回值只有一个,(返回值类型列表)可以不写 ()