Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
a0e173df
C
Coding Tree
项目概览
檀越@新空间
/
Coding Tree
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Coding Tree
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a0e173df
编写于
9月 19, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
61d56f60
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
258 addition
and
1 deletion
+258
-1
blog/golang/golang-function.md
blog/golang/golang-function.md
+256
-0
blog/golang/index.md
blog/golang/index.md
+2
-1
未找到文件。
blog/golang/golang-function.md
浏览文件 @
a0e173df
...
...
@@ -295,3 +295,259 @@ func main() {
```
## 匿名函数
语法格式
```
go
// 没有函数名称
func
(
参数列表
)(
返回值
){
}
```
示例1
```
go
package
main
import
"fmt"
func
main
()
{
sum
:=
func
(
a
int
,
b
int
)
int
{
return
a
+
b
}
ret
:=
sum
(
1
,
1
)
fmt
.
Printf
(
"%v"
,
ret
)
// 2
}
```
示例2
```
go
package
main
import
"fmt"
func
main
()
{
ret
:=
func
(
a
int
,
b
int
)
int
{
return
a
+
b
}(
1
,
1
)
fmt
.
Printf
(
"%v"
,
ret
)
// 2
}
```
## 闭包
闭包可以理解成:定义在一个函数内部的函数,本质上是将函数内部和函数外部连接起来的桥梁
```
闭包 = 函数 + 引用环境
```
示例1
```
go
package
main
import
(
"fmt"
)
// 返回一个函数
func
add
()
func
(
int
)
int
{
var
a
int
return
func
(
b
int
)
int
{
a
+=
b
return
a
}
}
func
main
()
{
f
:=
add
()
fmt
.
Println
(
f
(
1
))
// 1
fmt
.
Println
(
f
(
1
))
// 2
fmt
.
Println
(
f
(
1
))
// 3
f2
:=
add
()
fmt
.
Println
(
f2
(
1
))
// 1
fmt
.
Println
(
f2
(
1
))
// 2
fmt
.
Println
(
f2
(
1
))
// 3
}
```
示例2
```
go
package
main
import
(
"fmt"
"strings"
)
// 返回一个函数
func
makeSuffixFunc
(
suffix
string
)
func
(
string
)
string
{
return
func
(
name
string
)
string
{
if
strings
.
HasSuffix
(
name
,
suffix
)
{
return
name
}
else
{
return
name
+
suffix
}
}
}
func
main
()
{
txtFunc
:=
makeSuffixFunc
(
".txt"
)
jpgFunc
:=
makeSuffixFunc
(
".jpg"
)
fmt
.
Println
(
txtFunc
(
"test"
))
// test.txt
fmt
.
Println
(
jpgFunc
(
"test"
))
// test.jpg
}
```
示例3
```
go
package
main
import
(
"fmt"
)
// 返回两个函数
func
calc
(
base
int
)
(
func
(
int
)
int
,
func
(
int
)
int
)
{
add
:=
func
(
i
int
)
int
{
return
base
+
i
}
sub
:=
func
(
i
int
)
int
{
return
base
-
i
}
return
add
,
sub
}
func
main
()
{
f1
,
f2
:=
calc
(
10
)
fmt
.
Println
(
f1
(
1
),
f2
(
2
))
// 11 8
}
```
## 递归
递归函数:函数内部调用函数自身的函数
递归函数特点
-
递归就是自己调用自己
-
必须定义退出条件,否则就会成为死循环
-
递归很可能会出现栈空间内存溢出
示例:阶乘
for循环实现
```
go
package
main
import
"fmt"
// 阶乘
func
foo
(
n
int
)
int
{
ret
:=
1
for
i
:=
1
;
i
<=
n
;
i
++
{
ret
*=
i
}
return
ret
}
func
main
()
{
// 5! = 5 x 4 x 3 x 2 x 1
ret
:=
foo
(
5
)
fmt
.
Println
(
ret
)
// 120
}
```
递归实现
```
go
package
main
import
"fmt"
// 阶乘
func
foo
(
n
int
)
int
{
if
n
==
1
{
// 退出条件
return
1
}
else
{
// 自己调用自己
return
n
*
foo
(
n
-
1
)
}
}
func
main
()
{
// 5! = 5 x 4 x 3 x 2 x 1
ret
:=
foo
(
5
)
fmt
.
Println
(
ret
)
// 120
}
```
菲波那切数列
计算公式
```
f(n) = f(n-1) + f(n-2)
且
f(2) = f(1) = 1
```
代码实现
```
go
package
main
import
"fmt"
// 菲波那切数列
func
foo
(
n
int
)
int
{
if
n
==
1
||
n
==
2
{
// 退出条件
return
1
}
else
{
// 递归表达式
return
foo
(
n
-
1
)
+
foo
(
n
-
2
)
}
}
func
main
()
{
// foo(5) = foo(4) + foo(3) = 3 + 2 = 5
// foo(4) = foo(3) + foo(2) = 2 + 1 = 3
// foo(3) = foo(2) + foo(1) = 1 + 1 = 2
// foo(2) = 1
// foo(1) = 1
ret
:=
foo
(
5
)
fmt
.
Println
(
ret
)
// 5
}
```
blog/golang/index.md
浏览文件 @
a0e173df
...
...
@@ -42,4 +42,5 @@
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1zR4y1t7Wj?p=42&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj?p=45&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录