Go学习笔记 -- 函数和高阶函数
admin
2024-02-03 12:34:24
0

文章目录

    • Go 函数
      • 定义函数
      • 函数特性
        • 支持不定参
        • 支持多返回值和命名返回参数
        • 不支持嵌套,不支持重载
      • 高阶函数
      • 闭包
        • 什么是闭包
        • 用代码来解释
        • 闭包的作用

Go 函数

定义函数

使用 func 关键词,第一个括号里面定义参数类型以及参数的标识符,第二个括号里面定义返回值类型。

func print(contents string) (int, error) {//打印字符串并返回打印的字节数。return fmt.Println(contents)
}

函数特性

  • 支持不定参。
  • 支持多返回值。
  • 支持命名返回参数。
  • 不支持嵌套,同一个包内不能有两个相同名字的函数。
  • 不支持重载。
  • 不支默认参数。
  • 在 Go 中,函数也是一种类型,可以作为方法的入参或者返回结果。
  • 支持匿名函数和闭包。

其中先简单了解一下基本的特性。

支持不定参

如下,print 函数有一个可以接受多个 string 入参。
JAVA 里面的不定参类似,这其实相当于是接受一个 srting 类型的数组,但是这样的入参类型只能定义在函数的最后面。

func print(contents ...string) (int, error) {//打印字符串并返回打印的字节数。return fmt.Println(contents)
}
func main() {fmt.Println(print("11", "22"))
}
------------------------------------------------------
[11 22]
8 

支持多返回值和命名返回参数

上面的例子就是一个多返回值的函数,同时我们还能命名函数返回值。
返回的时候直接用 retun ,函数会自动将 counterr 返回回去。

func print(contents ...string) (count int, err error) {//接收打印的字节数和异常count,err = fmt.Println(contents) return
}
func main() {fmt.Println(print("11", "22"))
}
------------------------------------------------------
[11 22]
8 

不支持嵌套,不支持重载

以下代码都提示异常
文件①:/demo/demo_lib1.go

package main
import ("fmt"
)
//提示异常: other declaration of print
func print(sss int, contents ...string) (count int, err error) {//打印字符串并返回打印的字节数。count, err = fmt.Println(contents)return
}

文件②:/demo/demo_main.go

package main
import ("fmt"
)
//提示异常: other declaration of print
func print(contents ...string) (count int, err error) {//打印字符串并返回打印的字节数。count, err = fmt.Println(contents)return
}
func main() {fmt.Println(print2("11", "22"))
}

高阶函数

上面我们提到,在 Go 中,函数可以作为另一个函数的入参或者返回结果。而以函数作为参数或者返回值的函数就称为高阶函数。
高阶函数的条件,满足其一即可:

  1. 使用其他函数作为入参
  2. 把其他函数作为返回结果

例如:
下面的 calc 函数和 retFunc 函数都是高阶函数。

type mathFunc func(x, y int) intfunc calc(x int, y int, mf mathFunc) (int, error) {if mf == nil {return 0, errors.New("invalid operation")}return mf(x, y), nil
}func retFunc() mathFunc {return func(x, y int) int {return x + y}
}

闭包

什么是闭包

闭包是可以包含自由变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块为自由变量提供绑定的作用域。

用代码来解释

type mathFunc func(i int) int
func operate2() mathFunc {sum := 0return func(j int) int {sum += jreturn sum }
}

其中 operate2 函数中返回的这个匿名函数,就形成了一个闭包。
闭包中使用到了自由变量 sum ,这个 sum 是闭包函数所处函数环境中定义的,可以说匿名函数的功能被绑定在了变量 sum 上。

addBase := operate2(1) //addBase 为所有传入的 int 加 1
fmt.Println(addBase(2))
-----------------------------
3

闭包的作用

  1. 延迟动态生成程序逻辑,我们可以根据需要生成功能不同的函数。
  2. 缩小变量作用域,减少对全局变量的污染
    在上面的例子中,我们其实实现了一个累加器,如果我们定义的是全局变量 sum ,有可能会被其他操作污染,而且当我们需要实现很多个累加器时,我们就需要定义很多个全局变量 sum 1…n
    但是我们使用闭包的方式,将累加值定义在函数中,缩小其作用域,使每个函数有自己独立的累加值,避免了累加值被其他操作污染的情况。

相关内容

热门资讯

放羊的星星中所有的歌曲叫什么名... 放羊的星星中所有的歌曲叫什么名字01极速爱情-李雅微02对望-林志颖03paradise-李雅微04...
MAS曳步舞 是什么意思? MAS曳步舞 是什么意思?是一种风格,巴西风格的马来西亚风格
死神是神还是鬼脑筋急转弯 死神是神还是鬼脑筋急转弯鬼。死神是地狱的使者,说他是鬼不恰当,说他是神又没到那境界,但是说白了他就是...
科学练习册(牛津上海版)七年级... 科学练习册(牛津上海版)七年级上第九章电力与电信答案跪求啊~~17~36 D B A C C D C...
加刘三姐对歌歌词 加刘三姐对歌歌词 “男方:什么水面打跟斗呢,什么水面起高楼呢,什么水面撑阳伞,什么水面共白头?刘三姐...
怒与什么什么的成语 怒与什么什么的成语 怒开头的成语:怒不可遏、怒火中烧、怒气冲冲、怒形于色、怒气冲天、怒火冲天、怒...
女孩,姓王,阳历2008年3月... 女孩,姓王,阳历2008年3月7日,出生时间:下午16:52分, 请高人按生辰八字起名!急 急八字:...
NO是表示没有吗? NO是表示没有吗?表示否定的意思,没有,不是,无等等。
有没有盗墓的爱情小说 最好是悲... 有没有盗墓的爱情小说 最好是悲伤的 男主很冷的那种《我不是粽子,是个杯具》言情男主有点像小哥,呆呆冷...
《基础教育研究》和《教育探索》... 《基础教育研究》和《教育探索》这两本杂志哪个好一些?这要看你需要什么了。一个是侧重基础教育应用性。一...
店铺歇业语怎么写 店铺歇业语怎么写快回家过年了…小吃店歇业了…怎么写歇业语新年将至,正味餐饮谨此向大家致以新春的问候,...
不倾城不倾国是什么意思? 不倾城不倾国是什么意思?倾国倾城说的是女人长得好看;不倾国不倾城就是说长得不好看!意思就是长的不好看...
忏悔文全文 忏悔文全文往昔所造诸恶业皆由无始贪嗔痴从身语意之所生一切我今皆忏悔我今悉以清净三业,遍于法界极微尘刹...
海文考研的专业课怎么样啊? 海文考研的专业课怎么样啊?请问有人上过海文专业课的辅导班吗?我实在找不到专业课资料,而专业课辅导班又...
中国北方人的平均身高是多少,南... 中国北方人的平均身高是多少,南方人的平均身高是多少在北方,多高的男生或者女生才算是高大,在南方,多高...
找一个很多年前玩过的魔兽RPG... 找一个很多年前玩过的魔兽RPG图你那个 版本太老了, 玩都玩腻味了, 推荐你玩玩 , 仙邪之战,...
谁知道方婷创立伊指爱的故事? 谁知道方婷创立伊指爱的故事?你好 听说过这个故事 自己也没真正了解过 听起来挺伤感的 下次有机会也去...
随便求几个成语加解释 随便求几个成语加解释最好是我没见过得,谁都知道的就不要了,词语也行簪缨世族 [zān yīng...
吴京到底是如何成功的呢? 吴京到底是如何成功的呢? 一个成功的作品不是看票房,而是看能影响多少人。诚然,吴京的成功,不是看他票...
谁能提供有关男生宿舍女生宿舍的... 谁能提供有关男生宿舍女生宿舍的剧本素材?情节剧《男生宿舍》、《女生宿舍》两类大家熟悉的生活题材命题。...