package main
import"fmt"funcaaa(a int, b int) { // 函数的括号必须在第一行
fmt.Println(a + b)
}
funcbbb(a int, b int)int { // 有返回值的函数必须按照返回类型返回值
fmt.Println(a + b) // 可以不调用函数return a + b
}
funcq(args ...int) {
fmt.Println("q")
fmt.Println(args)
}
funcp(args ...int) {
fmt.Println(args) // args 为不定长参数,类型为 int ,多个值为: [1 2 3 4 5]
q(args...) // 将数组打散传参// 不定长参数放在参数最后,固定参数必须传值,不定长参数可以不传值// fmt.Println(args...) // 报错:cannot use args (type []int) as type []interface {} in argument to fmt.Println
fmt.Println(args[:]) // 切片
}
funcccc(a, b int) (sum int) { // 返回值:定义为sum,返回时,可以只写return,return不能省略。
sum = a + b // 返回值变量不能与参数重复,且要用括号return
}
funcmain() {
aaa(1, 3)
c := bbb(2, 5)
fmt.Println(c)
p(1, 2, 3, 4, 5) // [1 2 3 4 5]
fmt.Println(ccc(2, 3))
f := ccc // 函数是一等公民,函数名可以当作参数传递
fmt.Println(ccc)
fmt.Println("f", f(5, 5)) // 函数名是一个地址:0x937620
fmt.Printf("%T", ccc) // 函数类型:func(int, int) intvar ff func(int, int)int// 定义 ff 为一个 func(int,int) int 类型的变量,可以接受同类型的函数ccc
ff = ccc
ff(2, 3)
}
作用域:
// 局部作用域:
函数体内,for循环内,if初始化代码块内:
var v = 11if v := 1; v == 1 {
fmt.Println("aaa")
}
fmt.Println("v", v) // 11// 全局作用域:
定义在函数外的变量,即全局变量。
但是,在函数体内重新定义该变量时,会就近使用局部变量。
var a = 2functest() {
fmt.Println(a) // 2
}
funcmain() {
test() // 2
fmt.Println(&a) // 全局变量:0xd03250
a := 1
fmt.Println(a) // 1
fmt.Println(&a) // 局部变量:0xc0000120b0
test() // 2
}
匿名函数:
// 闭包,没有的变量从上级找
num := 10
f := func() {
num++
fmt.Println("匿名函数")
}
f()
fmt.Println(num) // 11
num := 1func() {
num++
}()
fmt.Println(num) // 2// num设置为形式参数,为局部变量,所以,num值传递给函数,复制了一份给局部变量,外部num不受影响,仍为1
num := 1func(num int) {
num++
}(num)
fmt.Println(num) // 1
num := 10func() { // 匿名函数定义必须调用, func literal evaluated but not used
num++
fmt.Println("匿名函数")
}() // 加括号直接调用匿名函数
fmt.Println(num) // 11
num := 10var fff func()
fff = func() { // 定义的func()类型的fff变量接收匿名函数
num++
fmt.Println("匿名函数")
}
fff()
fmt.Println(num) // 11func(a, b int) {
fmt.Println(a + b) // 3
}(1, 2) // 调用传值
i, j := func(x, y int) (max, min int) { // 返回值if x > y {
max = x
min = y
} else {
max = y
min = x
}
return
}(1, 3)
fmt.Println(i, j)
x := 11
i, j := func(x, y int) (max, min int) {
if x > y {
fmt.Println(x) // 1
max = x
min = y
x++
fmt.Println(x) // 2
} else {
fmt.Println(x) // 1
max = y
min = x
x++
fmt.Println(x) // 2
}
return
}(1, 3)
fmt.Println(i, j) // 3 1
fmt.Println(x) // 11// 匿名函数可以定义到函数体外,但是有名函数不可以定义到函数体内var f = func() {
fmt.Println("aaa")
}
递归:
var sum = 0funcdg(num int)int {
if num == 1 {
return1
}
num += dg(num - 1)
return num
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现