package main

import "fmt"

// 下面这函数就是闭包函数(就是返回一个匿名函数的地址的函数,其中要1.定义一个需要保护的局部变量i  2.一个匿名的函数) ,实现计数的功能
func Counter() func() int {
i := 0
res := func() int {
i++
return i }
fmt.Println("Counter内部:", res) //0x49d5d0是匿名函数的地址 res就是func() int这个匿名函数
fmt.Printf("%T\n", res) //res 的类型就是函数形 func() int
fmt.Printf("%T\n", res()) //res()是执行匿名函数,执行完返回值是1(int) fmt.Println("res():", res()) //打印是2的原因是res()是执行匿名函数,执行一次,匿名函数中的变量就运算一次且运行完后变量不被清理
fmt.Println("res():", res()) //这是第三次运行函数res()
return res //Counter函数返回的是 匿名函数的地址 } func main() { res1 := Counter() //执行Counter() 然后将返回值赋值给res1 ,res1 就是func() int类型变量
fmt.Printf("%T\n", res1) // res1 := Counter() res1就是函数名,res1 = func()int
fmt.Printf("%T\n", res1()) // res1()是执行func()int匿名函数,那么返回是Int
fmt.Println("res1():", res1) // 打印的地址和上面一样
fmt.Println("res1():", res1()) //这是第5次运行函数res() 5
fmt.Println("res1():", res1()) //这是第6次运行函数res() 6 res2 := Counter()
fmt.Println("res2():", res2) // 内存地址不发生改变 和res1一致
fmt.Println("res2():", res2()) // 但是重新进入了一次闭包函数 故i变量从0重新赋值了一遍
fmt.Println("res2():", res2())
}

go 闭包程序解读的更多相关文章

  1. CYPEESS USB3.0程序解读之---GPIO

    CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...

  2. CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)

    上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...

  3. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

  4. C#程序解读

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  5. JS之闭包详细解读

    闭包在红宝书中的解释就是:有权访问另一个函数作用域中的变量的函数. 1.变量作用域 全局变量:所有的函数外部定义的变量,它的作用域是整个script. 局部变量:定义在函数体内部的变量,作用域仅限于函 ...

  6. 【Arduino学习笔记02】第一个Arduino项目——点亮LED Blink.ino程序解读 Arduino程序基本结构 pinMode() digitalWrite() delay()

    /* Blink Turns an LED on for one second, then off for one second, repeatedly. */// define variables ...

  7. MyBatis最初的程序解读---API

    API详解:            * 线程安全问题出现的条件        (1) 只有单例对象才可能出现线程安全问题        (2) 多线程环境,即多个线程会共享这个单例对象         ...

  8. CYPEESS USB3.0程序解读之---SPI读写

    前面已经解读了GPIO以及同步FIFO操作,下面我们看一个SPI读写的例子,它是主程序命令从SPI中读写一些数据. SPI传输子程序看一下: 页地址,字节计数,缓冲区,读写标志 因为只能一页一页的读或 ...

  9. Javascript的那些硬骨头:作用域、回调、闭包、异步……

    终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义, ...

随机推荐

  1. 通过百度地图API--获取全国地图的经纬度

    因为要做一个前端画图需要经纬度,一个个的查询过麻烦,最终弄出这个,以备后查! import threading , time import requests from decimal import D ...

  2. 【原】Java学习笔记007 - 流程控制

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // for循环 // ...

  3. centos7防火墙开放端口等命令

    CentOS 7 开放防火墙端口 命令 最近公司新的server要求用CentOS7, 发现以前CentOS 6 系列中的 iptables 相关命令不能用了,查了下,发现Centos 7使用fire ...

  4. 5.5Python数据处理篇之Sympy系列(五)---解方程

    目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...

  5. python 完整项目开发流程

    1. 安装 python    2. 安装virtualenvwrapper    3. 虚拟环境相关操作    4. 进入虚拟环境, 安装django    5. 安装编辑器    6. 安装mys ...

  6. python:过滤字符串中的字母数字特殊符号

    今天遇到的字符串处理的问题,记录一下方便使用 str1 = input('请输入一个字符:') #初始化字符.数字.空格.特殊字符的计数 lowercase = 0 uppercase = 0 num ...

  7. logging_modules

    老师的博客:http://www.cnblogs.com/Eva-J/articles/7228075.html#_label13 basicconfig import logging logging ...

  8. 数据库【mysql篇】典型的一些练习题目

    班级表 class 学生表student 老师表 teacher 课程表course 成绩表 score 准备数据 创建数据库 create database tang_test charset='u ...

  9. HBase 是列式存储数据库吗

    在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行 ...

  10. js 点击复制代码 window.clipboardData.setData

    var v = document.getElementById("forcopy").value; window.clipboardData.setData('text',v); ...