Golang tips ----- 函数
1、在函数调用时,Golang没有默认参数值
2、一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符
3、拥有函数名的函数只能在包级语法块中被声明
4、函数值(闭包)属于引用类型并且不可比较
5、在循环中生成的所有函数值共享相同的循环变量,并且需要注意的是,函数值记录的是循环变量的地址,而不是循环变量某一刻的值。如果函数值都在循环结束运行的话,那对于循环变量,每个函数对应的都是相同的值。如下面的代码所示,最后迭代运行函数切片,输出的都将是相同的值5。因为它们记录的是变量n的地址,而n最后的值为5。
package main
import "fmt"
func main() {
var f []func()
nums := []int{1, 2, 3, 4, 5}
for _, n := range nums {
f = append(f, func(){
fmt.Println(n)
})
}
for _, fn := range f {
fn()
}
}
解决方法很简单,每次循环将循环变量赋值给一个临时变量t,并且在函数值中使用t。那么每个函数值都有n在各自时刻对应的副本t,而不会共享循环变量n。代码如下:
package main
import "fmt"
func main() {
var f []func()
nums := []int{1, 2, 3, 4, 5}
for _, n := range nums {
t := n
f = append(f, func(){
fmt.Println(t)
})
}
for _, fn := range f {
fn()
}
}
对于在循环中使用go语句或者defer语句,遇到此类问题解决的方法也是类似的。
6、在一个函数中执行多条defer语句,它们的执行顺序和声明顺序相反
7、当panic发生时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer 函数)
Golang tips ----- 函数的更多相关文章
- golang的函数
在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http. ...
- golang(06)函数介绍
原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民 ...
- golang笔记——函数与方法
如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...
- golang 原子操作函数
golang中的原子操作在sync/atomic package中. 下文以比较和交换操作函数为例,介绍其使用. CompareAndSwapInt32 比较和交换操作是原子性的. // Compar ...
- Golang之函数练习
小例题: package main import "fmt" /* 函数练习, 可变参数使用 写一个函数add 支持1个或多个int相加,并返回相加结果 写一个函数concat,支 ...
- [golang note] 函数定义
普通函数定义 √ golang函数基本组成:关键字func.函数名.参数列表.返回值.函数体和返回语句. • 语法如下 func 函数名(参数列表) (返回值列表) { // 函数体 } • 示例如下 ...
- golang中函数类型
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时 ...
- golang:函数总结
golang保留的函数 init(), main()是golang的保留函数,有如下特点: main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个 两 ...
- Golang tips
1.go test 测试单个函数 go test -v -test.run Test* 2.
随机推荐
- isEmpty与null、""的区别
前一段时间我阅读别人的代码,发现有的时候用isEmpty,有的时候用null,有的时候用"".我很困惑三者之间的区别,于是我就自己写了一个程序来验证一下 public class ...
- $(document).ready()即$()方法和window.onload方法的比较
以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...
- Genymotion Shell命令
命令行选项 •-h 输出帮助信息 •-r ip_address 连接到特定Genymotion虚拟设备 •-c "command" 在原生shell环境中执行给定命令而后返回 •- ...
- D/A转换器
电荷:带正负电的基本粒子.电的本质是使正负电荷分开,使电荷发生移动,实质是电子的转移,并不是创造电荷.电压:单位正电荷受电场力作用从A点移动到B点所做的功.电压方向从高电位指向低点位.电压是推动电荷定 ...
- Android 手机卫士13--进程设置
1.显示隐藏系统进程 修改ProcessManagerActivity的Adapter ..... @Override public int getCount() { if(SpUtil.getBoo ...
- Java中native的用法
原文来自:http://blog.csdn.net/funneies/article/details/8949660 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件, ...
- eclipse优化与标准化记录
1.文件使用UTF-8格式: 2.取消js验证: 3.设置java文件模板
- C++之函数重载
函数重载定义: 如果同一作用域内的几个函数名字相同但形参列表不同; 重载与const形参: Record (Phone); = Record(const Phone); Record(Phone*) ...
- Thumbnailator压缩图片
Thumbnailator是一款不可多得的处理图片的第三方工具包,它写法简单到让人无法相信,Java本身也有处理图片压缩的方法,但是代码冗长到让人痛不欲生,在篇末会给出Java本身的实现方式,做下对比 ...
- [TypeScript] JSON对象转TypeScript对象范例
[TypeScript] JSON对象转TypeScript对象范例 Playground http://tinyurl.com/nv4x9ak Samples class DataTable { p ...