Go函数
函数的基本认识
函数(function):每一个程序都包含很多的函数:函数是基本的代码块。
函数存在的目标:
- 对特定的、可复用的程序进行封装:
go
package main
func main() {
a,b := 1,2
c,d := 3,4
// res1 := a + b
// res2 := c + d
//a,b是实际参数(实参)
res1 := plus(a,b)
res2 := plus(c,d)
println(res1,res2)
}
//加法函数,计算两数之和(函数更具备语义化)
func plus(num1 int,num2 int) int {
res := num1 + num2
return res
}
- 可编写强大的函数接口(后续章节介绍)
函数声明
1.具名函数声明: 只能出现在全局作用域,函数内部不能进行函数声明
- func:函数声明关键字
- main:函数名
- ():形式参数(形参)容器
- {}:函数体(装有函数逻辑)的容器
go
package main
func main() {
}
2.函数表达式(匿名函数): 声明一个匿名函数赋值给一个变量,作为函数表达式
go
test := func(){
}
函数具备一等公民的特征:
- 函数可以进行参数传递(回调特性)
go
// cb => callback回调函数 => 函数参数
// func (a int, b int) int
func test(cb func()){
cb()
}
2.函数可以作为返回值抛出(闭包特性)
go
func test2() func() {
//函数内部定义的函数就是闭包函数
a := 1
//test函数能够访问test2函数的局部作用域
//test函数捆绑在test2的作用域下,才形成了闭包
test := func(){
fmt.println("closure")
}
//返回test函数让外部调用
return test
}
3.函数可以作为值进行变量赋值(值特性)
go
func main() {
//函数作为值赋给一个变量
testFunc := test3
testFunc()
}
func test3(){
fmt.Println("test3")
}
4.函数可以实现接口(接口特性,后续章节介绍)
main函数:
- main函数也是一个普通Go函数,可在任意地方调用执行
- main函数是Go程序中的入口函数(自动执行一次)
- main函数没有参数和返回值
go
package main
func main() {
fmt.Println("Hello World go!")
}
函数与作用域
- 作用域就是变量可访问的范围
- 作用域就是变量的容器
- main函数外有一个所有函数都能访问的作用域 - 全局作用域
- 每个函数内容是一个局部作用域(在函数内访问变量,函数内有的变量优先访问,不会访问函数外部同名变量)
- 函数作用域 => 可访问 => 外部作用域
- 函数内部也可以声明函数,函数作用域是可以嵌套的
- 函数内部只能定义函数表达式,不能进行函数声明
- 内部作用域可以访问外部作用域,但外部作用域是无法访问内部作用域的
go
func test4(){
//Go函数内部不允许函数声明
//func goFunc(){
//
//}
goFunc := func(){
fmt.Println("goFunc")
}
goFunc()
}