Go——小白学习之函数

简介: 普通函数调用流程(调用流程:先调用后返回,先进后出)func func2(c int) { fmt.Println("c=", c)}func func1(b int) { func2(b - 1) fmt.

普通函数调用流程(调用流程:先调用后返回,先进后出)

func func2(c int) {

fmt.Println("c=", c)

}

func func1(b int) {

func2(b - 1)

fmt.Println("b=", b)

}

func func0(a int) {

func1(a - 1)

fmt.Println("a=", a)

}

func main() {

func0(3)

}

结果为c= 1  b= 2  a= 3


函数递归

func func2(c int) {

if c == 0 {

fmt.Println("c=", c)

return                    //函数终止调用

}

func2(c - 1)                    //调用函数本身,直到满足条件

fmt.Println("c=", c)

}

func main() {

func2(3)

}


回调函数(函数有一个参数是函数类型,这个函数就是回调函数)

多态---多种形态,调用同一个接口,不同的表现,可以实现不同表现

先有想法,后面在实现功能

type newtype func(int, int) int

func add(a, b int) int {

return a + b

}

func minus(a, b int) int {

return a - b

}

func calc(a, b int, test newtype) (result int) {

//fmt.Println("calc")

result = test(a, b)

return

}

func main() {

num := calc(3, 5, add)

fmt.Printf("num=%d", num)

num = calc(3, 5, minus)

fmt.Printf("num=%d", num)

}

匿名函数基本语法

//带参数无返回值

func main() {

func(q, w int) {

fmt.Printf("q=%d,w=%d", q, w)

}(10, 20)

}

//有参有返回值

func main() {

max, min := func(i, j int) (max, min int) {

if i > j {

max = i

min = j

} else {

max = j

min = i

}

return

}(10, 20)

fmt.Printf("max=%d,min=%d", max, min)

闭包以引用方式捕获外部变量

func main() {

a := 10

str := "mike"

func() {

a = 888

str = "aaa"

fmt.Printf("内部 a=%d,str=%s", a, str)

}()

fmt.Printf("外部 a=%d,str=%s", a, str)

}            //返回结果都是匿名函数里的值

func test02() func() int {

var x int

return func() int {

x++

return x * x

}

}

//函数的返回值时一个匿名函数,返回一个函数类型

func main() {

f := test02() //返回值是一个匿名函数,通过f来调用返回的匿名函数,f来调闭包

fmt.Println(f())

fmt.Println(f())

fmt.Println(f())

fmt.Println(f())

}                                      //将函数作为第一级对象

目录
相关文章
|
2月前
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
2月前
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
10天前
|
Go
go函数
go函数
30 10
|
25天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
6天前
|
编译器 Go C++
Go to Learn Go之函数
Go to Learn Go之函数
10 0
|
8天前
|
编译器 Go 索引
Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用
本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。
|
2月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
2月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
2月前
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
|
2月前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
下一篇
无影云桌面