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.
随机推荐
- WinFrom子窗体向父窗体传值
父窗框mainForm;子窗体childForm,利用事件进行传值 在子窗体中的操作: public event EventHandler accept;public string value; pr ...
- 配置ssh免密码连接
建立ssh连接步骤: 1,在主机安装ssh-server,执行指令: apt-get install openssh-server 2,在主机上执行指令: netstat -atpn | grep 可 ...
- java猜数字游戏
import java.util.Scanner; //导入包 class GuessNum { public static void main(String[] args) { int num = ...
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- Linux 学习手记(4):Linux系统常用Shell命令
日期时间 date命令:显示当前时间日期 date -u # 显示格林威治(UTC)事件 date +%Y-%m-%d # 格式显示日期 date -s '20:25:25' # 修改系统时间,需要使 ...
- js一些小题(二)
******************************************************************* 一个全局下的函数: function test() { aler ...
- 项目、SVN clean的一些事
1.如果你发现你的文件修改了.Tomcat也重新了,但访问的还是旧的文件,这个时候你需要clean下你的项目. Clean will discard all build problems and bu ...
- atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...
- git学习笔记1
很早以前就听说了git,今天就开始使用git,并做简单记录 在Linux上安装Git 首先,你可以试着输入git,看看系统有没有安装Git: $ git The program 'git' is cu ...
- C语言泛型编程--抽象数据类型
一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...