开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
函数的声明分析
1. 结构:
func name(参数列表)(返回值列表){
函数体
}
结构分解:
解析:声明一个函数类型总会以关键字 func 作为开始,紧跟在关键字 func 之后的应该是这个函数的签名,包括了参数声明列表(在左边)和结果声明列表(在右边),两者用空格分隔。参数声明列表必须由圆括号括起来,多个参数声明之间需用逗号分隔。参数声明是参数名称在前,参数类型在后,中间以空格分隔。 另外,返回值列表描述了函数返回值的变量名以及类型,如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。需要注意的是,go语言中允许将函数作为参数传递即将函数作为返回值,这是实现闭包的基础。
2. 举例:调用一个简单的嵌套函数并输出* “无参数,无返回值的函数***”。**
func main() { //函数
fun1()
}
func fun1() { //嵌套函数
fmt.Println("无参数,无返回值的函数")
}
终端输出:
结构解析:
func main() { //函数
fun1()
}
函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行 。
func fun1() { //嵌套函数
fmt.Println("无参数,无返回值的函数")
}
嵌套函数:在go语言中,函数是一段封装好、可重复使用、针对单一功能的代码片段,它有利于程序的模块化和提高代码的可重用性。定义模块化函数,在调用时我们不需要再复写代码就可以使用,类似对功能函数的封装。且作为go语言中的核心设计,它与主函数一样均使用关键字func声明并遵循标识符的命名规范。
函数的使用范围分析
1. 结构:
func 函数名([参数列表])([返回参数列表]){ 代码块 }
结构分解:
解析:在Go语言中,如果变量名首字母大写,即代表着是个公有的变量;如果是变量首字母小写,代表着这个变量是私有的,函数名跟变量是一样的规则。公有、私有,这个其实就是控制变量的访问范围。,也就是当函数的函数名首字母大写时它不仅能被包内函数所调用,还能被其他包引用。而当函数名小写时,它只能被包内的函数使用,无法被外部包引用。
2. 举例: 实现一个仅在包内调用的函数后,它又能否被外部使用?
先实现一个包内调用函数
package main //包的声明
import "fmt" //引入包
func main() { //函数
str := "知链科技-区块链人才培养摇篮" //变量的初始化
fun2(str) //函数调用
}
func fun2(str string) { //嵌套函数
fmt.Println(str)
}
终端输出:
结构解析:
package main //包的声明
包声明:package main 定义了包名。它在源文件中指明了这个文件属于那个包。
import "fmt" //引入包
引入包: import ("fmt""time") 告诉 Go 编译器这个程序需要使用 fmt 包和time包,fmt 包实现了格式化 IO(输入/输出)的函数。
func main() { //函数
函数:func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。
str := "知链科技-区块链人才培养摇篮" //变量的初始化
变量的初始化赋值: 在Go语言中给变量的赋值可以分为三个阶段,先创建变量,在内存中开辟空间后再初始化变量,将变量初始化为underfined,最后再进行真正赋值。 变量通过关键字Var来命名标识符再通过明确变量类型来完成变量的完整声明的过程。 编译器也会检查函数调用中,来验证变量类型的正确性。
fun2(str) //函数调用
嵌套函数调用:嵌套函数的调用语句一般存在于main()函数中,当执行到fun2(str)时,就会跳转行fun2(str)函数体中的代码,该函数体代码执行完毕后,又回到main()函数,继续往下执行。在函数调用过程中由于是包内调用所以函数是可以被使用的。
func fun2(str string) { //嵌套函数
fmt.Println(str)
}
嵌套函数:在go语言中,函数是一段封装好、可重复使用、针对单一功能的代码片段,它有利于程序的模块化和提高代码的可重用性。定义模块化函数,在调用时我们不需要再复写代码就可以使用,类似对功能函数的封装。且作为go语言中的核心设计,它与主函数一样均使用关键字func声明并遵循标识符的命名规范。
3. 扩展:
那么现在我们将该函数放到其他包中进行引用会有怎样的结果?
终端输出报错:
提示无法找到所需要调用的函数
当我们使用函数首字母大写调用以后:
终端正常输出:
程序恢复正常,正确打印。
函数多返回值分析
1. 结构:
func 函数名(参数类别)(返回值列表){
函数体(函数返回值)
}
结构分解:
解析:* 一个函数可以没有返回值,也可以有一个返回值,也可以有返回多个值。在函数返回值中,如果返回值是同一种数据类型,则用括号包裹,用逗号分割每个返回值类型。如func text(a, b int) (int, int)。但是如果省略了返回值的参数名,在同类型的多返回值时,使用纯类型的代码可读性不好,无法区分每个返回值的含义。*
2. 举例:实现一个函数多返回值的运用并在过程中使用if语句判断输出字符串。
func main() { //函数
var total, res = totalNum(1, 2) //变量的初始化
fmt.Println(total) //语句&表达式输出
fmt.Println(res)
}
func totalNum(a, b int) (total int, res string) { //多返回值函数
var ms string //变量的声明
if a > 0 { //if…else 语句
ms = "a大于0"
} else {
ms = "a小于0"
}
return a + b, ms //函数多返回值
}
终端输出:
结构解析:
func main() { //函数
}
函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行 。
var total, res = totalNum(1, 2) //变量的初始化
变量的初始化: 在Go语言中给变量的赋值可以分为三个阶段,先创建变量,在内存中开辟空间后再初始化变量,将变量初始化为underfined,最后再进行真正赋值。值得注意的是在该变量初始化的过程中没有使用特定的数据类型而是使用的函数方法来获取赋值。
fmt.Println(total) //语句&表达式输出
fmt.Println(res)
语句&表达式输出: fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。
func totalNum(a, b int) (total int, res string) { //多返回值函数
}
多返回值函数: 在go语言中,函数是一段封装好、可重复使用、针对单一功能的代码片段,它有利于程序的模块化和提高代码的可重用性。定义模块化函数,在调用时我们不需要再复写代码就可以使用,类似对功能函数的封装。且作为go语言中的核心设计,它与主函数一样均使用关键字func声明并遵循标识符的命名规范。另外,在指定关键字下命名的返回值是预先声明好的,在函数内部可以直接使用,无需再次声明。命名返回值的名称不能和函数参数名称相同,否则报错提示变量重复定义。
var ms string //变量的声明
变量的声明:Go语言是静态类型语言,因此变量(variable)是有明确类型的。变量通过关键字Var来命名标识符再通过明确变量类型来完成变量的完整声明的过程。编译器也会检查函数调用中,来验证变量类型的正确性。
if a > 0 { //if…else 语句
ms = "a大于0"
} else {
ms = "a小于0"
}
if* *…else 语句判断:**if条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。此语句中先执行判断语句如果判断结果为true,则执行第一个条件下的语句表达式,若为false则继续往下判断执行第二个语句判断,如果判断结果为true,则执行第二个语句表达式,如此往复知道输出结束。
return a + b, ms //函数多返回值
函数多返回值:一个函数可以返回任意多个参数,两个参数之间用逗号(,)分隔。在指定关键字下命名的返回值是预先声明好的,在函数内部可以直接使用,无需再次声明。命名返回值的名称不能和函数参数名称相同,否则报错提示变量重复定义。
有趣的是:
当函数执行完的时候,并不是所有时候都要把结果打印,我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西,也就是返回值。函数通过return返回一个返回值。该语句中return关键字后接了多个返回值并最后输出返回,但当该关键字return不接返回值时,该函数也是可以完整执行的,只是函数会返回一个undefined, 主函数无法调用到该函数中所处理的数据。