go的函数定义、递归、延迟、匿名、高阶、闭包

简介: go的函数定义、递归、延迟、匿名、高阶、闭包

一、函数定义

package main
 
import "fmt"
 
func main() {
  f1()
  f2("hello")
  f3(18, "hello")
  num1 := f4(2, 3)
  fmt.Println(num1)
  num2, num3 := f5(2, 3)
  fmt.Println(num2, num3)
  //  多个返回值,只接收一个
  num4, _ := f5(5, 6)
  fmt.Println(num4)
  getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}
 
//无参无返回值函数
func f1() {
  fmt.Println("无参无返回值函数")
}
 
// 有一个参数的函数
func f2(str string) {
  fmt.Println(str)
}
 
//有两个参数的函数
func f3(num int, str string) {
  fmt.Println(num, str)
}
 
//有一个返回值的函数
func f4(num1, num2 int) int {
  return num1 + num2
}
 
//有多个返回值的函数
func f5(num1, num2 int) (int, int) {
  return num1 + num2, num1 - num2
}
 
//可变参数函数
func getSum(nums ...int) {
  var sum int
  for _, num := range nums {
    sum += num
  }
  fmt.Println(sum)
}


无参无返回值函数
hello
18 hello
5
5 -1
11
55

二、递归函数

package main
 
import "fmt"
 
//引用传递
 
func main() {
  fmt.Println(getSumT(5))
}
func getSumT(n int) int {
  if n == 1 {
    return 1
  } else {
    return getSumT(n-1) + n
  }
}
15

三、defer延迟执行

package main
 
import "fmt"
 
//defer延迟执行,逆序执行
//场景 io关闭操作
 
func main() {
  f("1")
  f("2")
  defer f("3")
  f("4")
}
func f(str string) {
  fmt.Println(str)
}


1
2
4
3

三、函数类型

package main
 
import "fmt"
 
//函数是一种数据类型、引用类型
 
func main() {
  //打印类型
  fmt.Printf("%T\n", f10)
  //定义函数变量
  var f11 func(string2 string)
  f11 = f10
  fmt.Println(f10)
  fmt.Println(f11)
  f11("abc")
 
}
func f10(str string) {
  fmt.Println(str)
}


func(string)
0xd0cde0
0xd0cde0
abc
 

四、匿名函数

package main
 
import "fmt"
 
//匿名函数
 
func main() {
  f21()
  //函数本身是一个地址
  f0 := f21
  f0()
  f3 := func() {
    fmt.Println("匿名函数")
  }
  f3()
  //匿名函数
  func(a, b int) {
    fmt.Println(a, b, "匿名函数")
  }(1, 2)
}
func f21() {
  fmt.Println("hello,func!")
}
hello,func!
hello,func!
匿名函数
1 2 匿名函数

五、高阶函数

package main
 
import "fmt"
 
//高阶函数
 
func main() {
  //高阶函数,参数为函数
  fmt.Println(oper(3, 3, add))
  //高阶函数,参数为匿名函数
  num := oper(5, 5, func(a int, b int) int {
    return a * b
  })
  fmt.Println(num)
}
func add(a, b int) int {
  return a + b
}
 
//函数参数为函数
func oper(a, b int, f func(int, int) int) int {
  return f(a, b)
}
6
25

六、闭包

 
 package main
 
import "fmt"
 
//高阶函数
 
func main() {
  r1 := increment()
  fmt.Println(r1())
  fmt.Println(r1())
  fmt.Println(r1())
  fmt.Println(r1())
}
 
//闭包
func increment() func() int {
  //  局部变量i
  i := 0
  //  定义个匿名函数
  fun := func() int {
    i++
    return i
  }
  return fun
}
1
2
3
4

七、其他

package fn_test
 
import (
  "fmt"
  "math/rand"
  "testing"
  "time"
)
 
//多返回值
func returnMultiValues() (int, int) {
  return rand.Intn(10), rand.Intn(20)
}
 
//返回一个函数的运行时间
func timeSpent(inner func(op int) int) func(op int) int {
  return func(n int) int {
    start := time.Now()
    ret := inner(n)
    fmt.Println("time spent", time.Since(start).Seconds())
    return ret
  }
}
 
func slowFun(op int) int {
  time.Sleep(time.Second * 1)
  return op
}
func TestFn(t *testing.T) {
  a, b := returnMultiValues()
  t.Log(a, b)
  num := timeSpent(slowFun)(5)
  t.Log(num)
}
 
//定义求和函数
func Sum(ops ...int) int {
  s := 0
  for _, op := range ops {
    s += op
  }
  return s
}
 
//延迟执行函数
func TestDefer(t *testing.T) {
  //清理资源,释放资源
  defer func() {
    t.Log("clear resources")
  }()
  t.Log("Started")
  //抛出异常
  panic("Fatal error")
}
func TestVarParam(t *testing.T) {
  t.Log(Sum(1, 2, 3, 4))
  t.Log(Sum(1, 2, 3, 4, 5))
}
=== RUN   TestFn
    func_test.go:31: 1 7
time spent 1.0113327
    func_test.go:33: 5
--- PASS: TestFn (1.01s)
=== RUN   TestDefer
    func_test.go:51: Started
    func_test.go:49: clear resources
--- FAIL: TestDefer (0.00s)
panic: Fatal error [recovered]
  panic: Fatal error
 
goroutine 18 [running]:
testing.tRunner.func1.2({0xacd920, 0xb1f9f0})
  C:/Program Files/Go/src/testing/testing.go:1389 +0x24e
testing.tRunner.func1()
  C:/Program Files/Go/src/testing/testing.go:1392 +0x39f
panic({0xacd920, 0xb1f9f0})
  C:/Program Files/Go/src/runtime/panic.go:838 +0x207
jike_introduction/src/ch10/func_test.TestDefer(0xc000148000?)
  F:/myCode/goland/jike_introduction/src/ch10/func/func_test.go:53 +0x98
testing.tRunner(0xc0000841a0, 0xafbbd8)
  C:/Program Files/Go/src/testing/testing.go:1439 +0x102
created by testing.(*T).Run
  C:/Program Files/Go/src/testing/testing.go:1486 +0x35f

目录
相关文章
|
8月前
|
Go
Go 语言使用 goroutine 运行闭包的“坑”
Go 语言使用 goroutine 运行闭包的“坑”
42 0
|
8月前
|
算法 Java Go
Go语言GC:吞吐量和延迟的博弈
Go语言GC:吞吐量和延迟的博弈
69 0
|
8月前
|
缓存 算法 搜索推荐
递归函数就这么简单!通俗的Go语言递归指南
递归函数就这么简单!通俗的Go语言递归指南
49 0
|
8月前
|
Serverless Go
Go语言闭包不打烊,让你长见识!
Go语言闭包不打烊,让你长见识!
32 0
|
1月前
|
存储 算法 Go
go语言中的延迟执行函数
【5月更文挑战第13天】`defer`是Go语言中用于延迟执行函数的关键字,尤其适用于资源管理,如文件关闭和锁的释放。它在函数返回前按照LIFO顺序执行,确保资源在任何返回路径下都能正确释放。`defer`可以拦截`panic`并在函数返回前执行,但无法阻止某些致命的`panic`。此外,`defer`可用于修改返回值、输出调试信息和还原变量值。尽管在某些场景下可能影响性能,但Go的优化使得其在多数情况下性能表现良好,特别是在资源清理方面。在Go 1.20及以后的版本,`defer`的性能已显著提升,尤其是在高计算量的场景下。
249 2
|
11天前
|
Go
Go语言进阶篇——浅谈函数中的闭包
Go语言进阶篇——浅谈函数中的闭包
|
1月前
|
Go C++
go 语言回调函数和闭包
go 语言回调函数和闭包
|
1月前
|
Java Go 区块链
【Go语言专栏】Go语言中的延迟执行与defer语句
【4月更文挑战第30天】Go语言的延迟执行与defer语句用于资源释放和错误处理。defer通过关键字定义,函数返回时执行,顺序与定义相反。参数在定义时求值。应用包括资源释放、错误处理、成对操作和函数包装,是Go编程的关键特性。
|
1月前
|
存储 编译器 Go
GO闭包实现原理(汇编级讲解)
函数闭包一点也不神秘,它就是函数和引用环境而组合的实体。在Go中,闭包在底层是一个结构体对象,它包含了函数指针与自由变量。Go编译器的逃逸分析机制,会将闭包对象分配至堆中,这样自由变量就不会随着函数栈的销毁而消失,它能依附着闭包实体而一直存在。因此,闭包使用的优缺点是很明显的:闭包能够避免使用全局变量,转而维持自由变量长期存储在内存之中;但是,这种隐式地持有自由变量,在使用不当时,会很容易造成内存浪费与泄露。附着闭包实体而一直存在。
55 0
GO闭包实现原理(汇编级讲解)
|
10月前
|
存储 Rust 算法
Go中的匿名函数与闭包
Go中的匿名函数与闭包
53 0