函数function

  • Go函数不支持嵌套、重载和默认参数
  • 但支持以下特性:

  1. 无需声明原型
  2. 不定长度变参
  3. 多返回值
  4. 命名返回值参数
  5. 匿名函数
  6. 闭包
  • 定义函数使用关键字func,且左大括号不能另起一行
  • 函数也可以作为一种类型使用

返回值及参数说明

func A(a int, b string) (int, string, int)  { //第一个小括号当中是你的参数列表,第二个小括号是你的返回值列表}
func A(a, b, c int) (int, string, int)  {//如果abc都是int型的话,可以按照这种方法进行简写,同样的方法也适用于返回值当中}
func A() (a, b, c int)  { //1:如果这样写的话就必须要命名返回值//命名返回值和不命名返回值得区别
}
func A() (int, int, int)  { ////命名返回值和不命名返回值得区别a, b, c := 1,2,3return a,b,c//如果此时没有命名返回值的时候,那么在返回值得时候就必须写上return a,b,c//当然为了代码的可读性,这里我们规定必须return 的时候加上返回值名
}

不定长变参

package mainimport "fmt"func main()  {A(1,2,3,4,5,6,7)}func A(a ...int) {// 这里采用的是不定长变参,不定长变参必须是参数的最后一个参数,后面不能再跟 b string这样的参数fmt.Println(a)
}
package mainimport "fmt"func main()  {s1:= []int{1,2,3,4}a,b :=1,2A(a,b)fmt.Println(a,b)B(s1)fmt.Println(s1)}func A(a ...int) {//这里传进来的实际上是一个slice,引用类型a[0] = 3a[1] = 4//尽管我们在函数A当中接收到的是一个slice,但是它得到的是一个值拷贝//和直接传递一个slice的区别看函数Bfmt.Println(a)
}
func B(s []int)  {//这里并不是传递一个指针进去,而是对这个slice的内存地址进行了一个拷贝//这里还可以看到像int型、string型进行常规的参数传进去的话,只是进行了个值拷贝,slice传进去虽然也是拷贝,但是它是内存地址的拷贝s[0] = 4s[1] = 5s[2] = 6s[3] = 7fmt.Println(s)//在这里 我们看到我们在函数B当中的修改,实际上影响到了我们main函数当中的变量s1//如果直接传递一个slice,它的修改就会影响到这个slice的本身}PS:值类型和引用类型进行函数传参拷贝是不一样的,一个是拷贝值,一个是拷贝地址
package mainimport ("fmt"
)func main() {a := 1A(&a) //这里取出a的地址fmt.Println(a)}func A(a *int) { //传递的是指针类型*a = 2 //在操作的时候需要去它的值进行操作,这个时候函数A就可以改变原始a的值fmt.Println(*a)
}

函数类型的使用

package mainimport ("fmt"
)func main() {a := Aa() //这个时候是将A的函数类型赋值给a,在go语言当中一切皆是类型啊}
func A() {fmt.Println("Func A")
}

匿名函数的使用

package mainimport ("fmt"
)func main() {a := func() {//此时这个代码块就是一个匿名函数,这个函数本身没有名称,我们将她赋值给a,然后调用fmt.Println("Func A")}a() //依然可以打印func A
}

GO语言当中的闭包

package mainimport ("fmt"
)func main() {f := closure(10)res1 := f(1)fmt.Println(res1)res2 := f(2)fmt.Println(res2)}func closure(x int) func(int) int {fmt.Printf("%p \n", &x)return func(y int) int {fmt.Printf("%p \n", &x)return x + y}
}
//这里可以看出3次打印x的地址都是一样的

defer

  • defer的执行方式类似其它语言中的析构函数,在函数执行体结束后按照调用顺序的相反顺序逐个执行
  • 即使函数发生严重错误也会执行
  • 支持匿名函数的调用
  • 通常用于资源清理、文件关闭、解锁以及记录时间等操作
  • 通过与匿名函数配合可在return之后修改函数计算结果
  • 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址

  • GO没有异常机制,但有panic/recove模式来处理错误
  • Panic可以在任何地方引发,但recover只有在defer调用的函数中有效

package mainimport ("fmt"
)func main() {fmt.Println("A")defer fmt.Println("B")defer fmt.Println("C")
}
//PS:打印的结果就是A C B
package mainimport ("fmt"
)func main() {for i := 0; i < 3; i++ {//defer fmt.Println(i)defer func() {fmt.Println(i)}() //调用这个函数}
}//刚才直接打印的时候,是作为一个参数传递进去,运行到defer的时候是将这个i的值进行了一个拷贝,所以打印的是 2 1 0
//这种情况下i一直是一个地址的引用,i一直引用的是局部变量的i,在退出这个循环体的时候 i已经变成了3,在main函数return的时候,开始执行defer语句,defer语句的时候i已经变成了3

异常机制

package mainimport ("fmt"
)func main() {A()B()C()}func A() {fmt.Println("Func A")
}
func B() {defer func() {if err := recover(); err != nil {fmt.Println("Recover in B")}}()panic("Panic in B")}
func C() {fmt.Println("Func C")
}
package mainimport ("fmt"
)func main() {var fs = [4]func(){}for i := 0; i < 4; i++ {defer fmt.Println("defer i=", i) //这个i是传递进来的参数,所以是值得拷贝defer func() {fmt.Println("defer_closure i=", i) //这里的i是引用外部的i,所以循环结束后,i变成了4}()fs[i] = func() {fmt.Println("closure i = ", i) //这里也是引用外部的i,所以循环结束后i变成了4}}for _, f := range fs {f()}
}

golang 函数定义相关推荐

  1. Golang 函数定义 不定数目参数定义 多个输入参数函数 (...) 不定参数 可变参数 定义

    使用 三点水 - 号 定义 Golang 中的不定参数 使用语法: 不定参数集合名 - (不定参数集合)数据类型 示例: package mainimport "fmt"func ...

  2. golang 函数一 (定义、参数、返回值)

    对于GoLang函数的定义或者说理解: 函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你 ...

  3. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {return } 通过函 ...

  4. electron/nodejs实现调用golang函数

    https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀 ...

  5. Go语言自学系列 | golang函数的参数

    视频来源:B站<golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  6. Go语言自学系列 | golang 函数

    视频来源:B站<golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]> 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持! ...

  7. Python函数(函数定义、函数调用)用法详解

    函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...

  8. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  9. Go 学习笔记(15)— 函数(01)[函数定义、函数特点、多值返回、实参形参、变长参数,函数作为参数调用]

    1. 函数定义 Go 语言最少有个 main() 函数.函数声明告诉了编译器函数的名称,返回类型和参数. func funcName(parameter_list)(result_list) {fun ...

最新文章

  1. Google Guice使用入门
  2. 【网络流】 HDU 4183 Pahom on Water 拆点
  3. 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
  4. python开源嵌入式_Neo4j 推出基于 Python 的嵌入式图数据存储
  5. openssl 创建 CA 详细操作手册
  6. 编写函数main求3!+6!+9!python_Python day 6(3) Python 函数式编程1
  7. python如何在没有环境的电脑上执行_没安装python的电脑可以运行python写的程序吗 python语言编写的程...
  8. ABP架构学习系列二:ABP中配置的注册和初始化
  9. bzoj1096 [ZJOI2007]仓库建设(斜率)
  10. MAML: meta learning 论文分析
  11. 在TCGA中查找mutation突变
  12. 小蜜蜂java小游戏_小游戏-打小蜜蜂
  13. Vue-cli 脚手架构建的项目使用echarts进行数据可视化
  14. Android显示九宫图(自定义圆角,仿微信九宫格图)
  15. P1247 取火柴游戏 (博弈论)
  16. Air Jordan 33 Performance Review
  17. Lab 5:面对面需求获取与原型设计
  18. c语言解决方程的论文,c语言编程求解线性方程组论文1.doc
  19. 什么是标签(Tags)
  20. 计算机毕业设计Java农业信息化服务平台(源码+系统+mysql数据库+lw文档)

热门文章

  1. Python_序列对象内置方法详解_String
  2. 使用MLX90640自制红外热像仪(四):stm32f103c8t6刷320x240分辨率屏的时间测试
  3. 关于“#ifdef __cplusplus” 和 extern C 的问题
  4. Countly 19.02.1 发布,实时移动和 web 分析报告平台
  5. 学习vue中遇到的报错,特此记录下来
  6. 阿里云服务器常见用语
  7. Java泛型中的PECS原则
  8. [转]verilog语法学习心得
  9. windows下安装pygtk报g_assertion_message无法定位libglib-2.0-0.dll错误解决
  10. 多线程问题导致的JDBMonitor的bug分析