// test01 project main.go
package main import (
"fmt"
) // 单返回值的函数
func plus(a int, b int) int {
// Go 需要明确的返回值
return a + b
} // (int, int) 在这个函数中标志着这个函数返回 2 个 int。
func vals() (int, int) {
return 3, 7
} // 可变参数函数。可以用任意数量的参数调用。例如,fmt.Println 是一个常见的变参函数。
// 这个函数使用任意数目的 int 作为参数。
func sum(nums ...int) {
fmt.Print(nums, " ")
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
} // Go 支持通过 闭包来使用 匿名函数。匿名函数在你想定义一个不需要命名的内联函数时是很实用的
// 这个 intSeq 函数返回另一个在 intSeq 函数体内定义的匿名函数。这个返回的函数使用闭包的方式 隐藏 变量 i。
func intSeq() func() int {
i := 0
return func() int {
i += 1
return i
}
} // 递归
func fact(n int) int {
if n == 0 {
return 1
}
return n * fact(n-1)
} func main() {
res := plus(1, 2)
fmt.Println("1+2 =", res) // 通过多赋值 操作来使用这两个不同的返回值
a, b := vals()
fmt.Println(a)
fmt.Println(b) // 如果你仅仅想返回值的一部分的话,你可以使用空白定义符 _
_, c := vals()
fmt.Println(c) // 变参调用
sum(1, 2)
sum(1, 2, 3) // 如果你的 slice 已经有了多个值,想把它们作为变参使用,你要这样调用 func(slice...)
nums := []int{1, 2, 3, 4}
sum(nums...) // 闭包
// 我们调用 intSeq 函数,将返回值(也是一个函数)赋给nextInt。这个函数的值包含了自己的值 i,这样在每次调用 nextInt 时都会更新 i 的值。
nextInt := intSeq() // 通过多次调用 nextInt 来看看闭包的效果。
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt()) // 为了确认这个状态对于这个特定的函数是唯一的,我们重新创建并测试一下。
newInts := intSeq()
fmt.Println(newInts())
fmt.Println(newInts()) // 递归函数调用
fmt.Println(fact(0))
fmt.Println(fact(1))
fmt.Println(fact(2))
fmt.Println(fact(3))
fmt.Println(fact(4))
fmt.Println(fact(5))
fmt.Println(fact(6))
fmt.Println(fact(7))
}
输出
// 普通函数
1+2 = 3 // 多返回值
3
7
7 // 可变参数函数
[1 2] 3
[1 2 3] 6
[1 2 3 4] 10 // 闭包
1
2
3
1
2 // 递归
1
1
2
6
24
120
720
5040

备注:

  • 闭包:是能够读取其他函数内部变量的函数;
  • 匿名函数:一个没有指定名称的函数。匿名函数的参数规则、作用域关系与有名函数是一样的;匿名函数的函数体通常应该是 一个表达式,该表达式必须要有一个返回值。

最新文章

  1. Ruby 里的 %Q, %q, %W, %w, %x, %r, %s, %i (译)转
  2. 网页设计之jQuery
  3. lua 面向对象编程类机制实现
  4. reqwest请求api和约束(转载)
  5. Linux查看当前目录下文件夹和文件的大小
  6. maven 的一些基本操作
  7. 使用了BeanUtils的简单操作
  8. 【STL源码学习】细品vector
  9. 使用git批量删除分支
  10. ASP.NET 控制器
  11. LeetCode-两数之和
  12. nginx配置vue项目部署访问无问题,刷新出现404问题
  13. Android之androidmainfest.xml配置文件详解
  14. tomcat修改端口号
  15. mysql 循环
  16. Linux下的tr编辑器命令详解
  17. 使用sts(SpringToolSuite4)无法将项目部署到tomcat容器
  18. 阿里云rds 备份和还原
  19. C#(近期目标)
  20. POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)

热门文章

  1. 未使用绑定变量对share_pool的影响
  2. innodb锁和事物
  3. jQ实现图片无缝轮播
  4. matlab图像处理程序大集合
  5. Linux系统设置 SSH 通过密钥登录
  6. Linux文件系统之INode
  7. JAVA高并发集合详解
  8. 对于Spring MVC 拦截器的一些了解
  9. Linux服务器内存池技术是如何实现的
  10. token的分层图如下