GO语言-04函数

简介: 自己学习Go语言学习过程中的记录与总结,希望对你能有帮助。第四篇:学习Go语言的函数定义,匿名函数,闭包结构
初心是记录和总结,自己学习Go语言的历程。如果能帮助到你,这是我的荣幸。

函数

学习好Go语言的函数,记住一个技巧:Go语言是强类型语言

语法:

func 函数名(参数名 参数类型,...)(返回值类型1,返回值类型2,...){
    return 返回值类型1,返回值类型2,...
}
  • func是定义函数的关键字,不可省略。
  • 参数名后面要标明参数的类型,可以一个或多个参数,也可以是无参函数,连续相同类型的参数可以这样写:a,b int,其中a,b是变量名。
  • 函数可以有一个或多个,也可以没有返回值,只需要写明返回的类型即可,在写return返回的时候要和返回值类型一一对应。单个返回值的时候可以去掉括号。

示例:

func main(){
   res := add(10,20) //30
}

func add(a,b int) int{
    return a + b
}

我们之前说过,Go语言是以包为单位管理的,它没有类和对象的概念,所以这并不同面向对象编程的思路以类管理。所以当你定义了一个方法时,这个方法在这个包内部(其他方法处)是可以直接拿定义名使用的,就像这样:

新了解:其实在Go语言中 函数也是属于一个类型
func main(){
    var myfunc func() //定义一个函数类型
    myfunc = sayHello // add是在这个包内的方法,可以直接通过方法名赋值给我们定义的myfunc变量
    myfunc()
}

func sayHello(){
    fmt.Println("你好")
}

当我们了解到函数也属于类型的时候,就可以整活了,我们不妨设想试一试,能不能把函数作为参数,进行传递呢?

  • 函数作为参数传递的话,我们需要写一个参数为函数的函数
func main(){
    res := alu(10,20,mult)
    fmt.Println(res)
}

// 首先定义一个函数,准备将它作为参数传递。该函数是一个乘法函数,接收两个float的数,然后将他们相乘并返回
func mult(a, b int) int {
    return a * b
}

// 定义一个函数用来接收函数,并调用这个函数(哈哈套娃行为)
func alu(a, b int, fun func(int, int) int) int {
    res := fun(a, b)
    return res
}

这样写的好处是我定义了一个对a和b通用操作的方法alu,而对a和b具体怎么操作,是看fun函数是怎么定义。

还有另外一种传参的方式:匿名函数

匿名函数

作为参数传递

还是依照上面的例子,这次我们使用匿名函数作为参数传递。那么啥是匿名函数?就是没有名字的函数

func main(){
    res = alu(10,20,func(a int, b int) int {
        return a * b
    })
    fmt.Println(res)
}

// 定义一个函数用来接收函数,并调用这个函数(哈哈套娃行为)
func alu(a, b int, fun func(int, int) int) int {
    res := fun(a, b)
    return res
}
注意哦,这里使用 res = 是因为我上个例子中 res 已经通过 :=定义过了,记住 :=是定义用的。

没有名字的函数就别在外局单独定义啦,不然别人怎么找到呢?可以这样使用。在匿名函数的最后加上(传入的参数),实现自己调用执行,返回的结果可以用一个变量接收。

func main(){
    res = func(a int, b int) int {
        return a + b
    }(1, 2)
    fmt.Println(res) //打印匿名函数返回值
}

作为函数的返回值

作为函数的返回值,我们可以这样想,定义一个函数它的返回值是函数,通过一个例子感受一下

func main(){
    speed := fast_shoes("张三")
    fmt.Println(speed(10)) // 20
}

func fast_shoes(name string) func(_speed int) int {
    fmt.Println(name + "获得飞速鞋子一双")
    speed := 10
    return func(_speed int) int {
        _speed += speed
        return _speed
    }
}

fast_shoes函数,接收一个人的名字,返回的是一个函数(这个函数的返回值是int )。这个例子我们实现的是一个人获得了一双“飞速鞋子”,那么“飞速鞋子”的初始属性是10,我们要做到将这个人的初始速度(是10)再增加10。

fmt.Println(speed(10)),调用10次的结果输出也是20。那么如果我想说,我想持续一段时间内,这个鞋子还拥有 越跑越快的效果呢?了解一下闭包

闭包

我们先对上述的代码改造一下:

func main(){
    speed := fast_shoes("张三")
    for i := 0; i < 10; i++ {
        fmt.Println(speed(10)) // 20,21,22,23,24,25,26,27,28,29
    }
}

func fast_shoes(name string) func(_speed int) int {
    fmt.Println(name + "获得飞速鞋子一双")
    speed := 10
    return func(_speed int) int {
        _speed += speed
        speed ++
        return _speed
    }
}

你会发现调用了10次,输出的结果再往上叠加。原因是我们加了speed++

我们称:内层函数+外层函数局部变量(可以是入参或者定义的局部变量) = 闭包结构

闭包结构有这样一个特点speed局部变量不会随着外层函数fast_shoes的结束而销毁。本来执行完fast_shoes("张三")后,speed就会被销毁,但是此时内层函数使用了外层函数的局部变量时,speed这个局部变量的生命周期就发生改变了,它在main函数中的speed()不再调用时才会被销毁。

目录
相关文章
|
8天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
36 0
|
1天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
17 6
Go语言学习12-数据的使用
|
2天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
2天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
10 0
|
3天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
3天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
4天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
5天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
13 1
|
5天前
|
Go
|
6天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
134 1