文章目录
一、函数的基本语法:
1. 语法:
// 函数定义
func 函数名([参数1 类型, 参数2 类型, ...]) {
函数体;
}
// 函数调用
函数名([参数1, 参数2, ...])
2. 不定参数列表:
// 函数定义
func 函数名(args...int) {
// args: 自定义不定参数名, 是一个array
函数体;
}
3. 函数的返回值:
语法:
func 函数名([参数列表 参数类型]) 返回值类型 {
函数体
return 返回值
}
var res 参数类型
res = 函数名([参数列表])
示例:
func test(a, b int) (c, d, sum int) {
sum = a + b
c = a
d = b
return
}
func main() {
_, _, res := test(2, 3)
fmt.Println(res) // 5
}
二、内存:
1. 栈区存储原理:
2. 函数返回值:
3. 函数的嵌套调用:
三、函数:
1. 函数类型:
函数名表示一个地址, 函数在代码区的地址;
函数类型: func
var fun func(int, int)
函数类型别名:
type FUNCDEMO func(int, int) // 类型别名
var f FUNCDEMO
func demo(a,b int) {
return a+b
}
f = demo1
res := f(2,3)
2. 函数作用域:
3. 匿名函数与闭包:
在一个函数中定义另一个函数;
func main() {
var num int
num = 9;
f := func() {
num ++
fmt.Println(num) // 10
}
f()
fmt.Println(num) // 10
}
闭包:
在go语言中,所有的匿名函数都是闭包
func test() func() int {
var x int
return func() int {
x++
return x
}
}
func main() {
f := test()
fmt.Println(f()) // 1
fmt.Println(f()) // 2
fmt.Println(f()) // 3
}
4. 递归函数:
func fib(x int) int {
if x == 1 {
return 1
}
if x == 2 {
return 1
}
return fib(x-1) + fib(x-2)
}
func main() {
fmt.Println(fib(10)) // 55
}
四、工程管理:
1. 同级别多文件:
.
├── main
├── main.go
└── test.go
package
的包名要一致
// test.go
package main
import "fmt"
func test() {
fmt.Println("test")
}
// main.go
package main
import "fmt"
func main() {
fmt.Println(1234)
test()
}
命令行执行go build 文件列表
生成main
二进制文件;
./main
执行二进制文件;
2. 不同级别多文件:
没有实现, 后期解决
.
└── src
├── main.go
├── test.go
└── userinfo
└── userlogin.go
// main.go
package main
import (
"fmt"
"userinfo"
)
func main() {
fmt.Println(1234)
test()
// 夸包调用
// 包名.函数名() (函数首字母大写)
userinfo.UserInfo()
}
// userlogin.go
package userinfo
import "fmt"
// 不同目录, 包名不同
// 包内函数的开头字母要大写
func UserInfo() {
fmt.Println("登录成功...")
}