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 ----- 函数的更多相关文章

  1. golang的函数

    在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http. ...

  2. golang(06)函数介绍

    原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民 ...

  3. golang笔记——函数与方法

    如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...

  4. golang 原子操作函数

    golang中的原子操作在sync/atomic package中. 下文以比较和交换操作函数为例,介绍其使用. CompareAndSwapInt32 比较和交换操作是原子性的. // Compar ...

  5. Golang之函数练习

    小例题: package main import "fmt" /* 函数练习, 可变参数使用 写一个函数add 支持1个或多个int相加,并返回相加结果 写一个函数concat,支 ...

  6. [golang note] 函数定义

    普通函数定义 √ golang函数基本组成:关键字func.函数名.参数列表.返回值.函数体和返回语句. • 语法如下 func 函数名(参数列表) (返回值列表) { // 函数体 } • 示例如下 ...

  7. golang中函数类型

    今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时 ...

  8. golang:函数总结

    golang保留的函数 init(), main()是golang的保留函数,有如下特点: main() 只能用在main包中,仅可定义一个,init() 可定义任意包,可重复定义,建议只定义一个 两 ...

  9. Golang tips

    1.go test 测试单个函数 go test -v -test.run Test* 2.

随机推荐

  1. isEmpty与null、""的区别

    前一段时间我阅读别人的代码,发现有的时候用isEmpty,有的时候用null,有的时候用"".我很困惑三者之间的区别,于是我就自己写了一个程序来验证一下 public class ...

  2. $(document).ready()即$()方法和window.onload方法的比较

    以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...

  3. Genymotion Shell命令

    命令行选项 •-h 输出帮助信息 •-r ip_address 连接到特定Genymotion虚拟设备 •-c "command" 在原生shell环境中执行给定命令而后返回 •- ...

  4. D/A转换器

    电荷:带正负电的基本粒子.电的本质是使正负电荷分开,使电荷发生移动,实质是电子的转移,并不是创造电荷.电压:单位正电荷受电场力作用从A点移动到B点所做的功.电压方向从高电位指向低点位.电压是推动电荷定 ...

  5. Android 手机卫士13--进程设置

    1.显示隐藏系统进程 修改ProcessManagerActivity的Adapter ..... @Override public int getCount() { if(SpUtil.getBoo ...

  6. Java中native的用法

    原文来自:http://blog.csdn.net/funneies/article/details/8949660 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件, ...

  7. eclipse优化与标准化记录

    1.文件使用UTF-8格式: 2.取消js验证: 3.设置java文件模板

  8. C++之函数重载

    函数重载定义: 如果同一作用域内的几个函数名字相同但形参列表不同; 重载与const形参: Record (Phone); = Record(const Phone); Record(Phone*) ...

  9. Thumbnailator压缩图片

    Thumbnailator是一款不可多得的处理图片的第三方工具包,它写法简单到让人无法相信,Java本身也有处理图片压缩的方法,但是代码冗长到让人痛不欲生,在篇末会给出Java本身的实现方式,做下对比 ...

  10. [TypeScript] JSON对象转TypeScript对象范例

    [TypeScript] JSON对象转TypeScript对象范例 Playground http://tinyurl.com/nv4x9ak Samples class DataTable { p ...