当前位置: 首页 > wzjs >正文

百度搜搜网站自动显示图片百度广告怎么收费

百度搜搜网站自动显示图片,百度广告怎么收费,今日刚刚发生的新闻2021,ui设计案例网站文章目录 基本介绍基本概念闭包示例闭包的核心特性闭包的典型使用场景1. 计数器/生成器模式2. 函数工厂3.中间件模式 闭包捕获的外部变量存储位置存储机制详解 被闭包捕获的外部变量的修改影响范围1. 多个闭包共享同一个外部变量(会影响)2. 每次调用生成…

文章目录

  • 基本介绍
  • 基本概念
  • 闭包示例
  • 闭包的核心特性
  • 闭包的典型使用场景
    • 1. 计数器/生成器模式
    • 2. 函数工厂
    • 3.中间件模式
  • 闭包捕获的外部变量存储位置
    • 存储机制详解
  • 被闭包捕获的外部变量的修改影响范围
    • 1. 多个闭包共享同一个外部变量(会影响)
    • 2. 每次调用生成独立的闭包实例(不会影响)
    • 3.关键区分点
  • 闭包底层原理
  • 注意事项
    • 1. 循环中的闭包陷阱
    • 2. 并发安全问题
    • 3. 性能

基本介绍

闭包(Closure)是Go语言中一个重要的特性,它允许函数访问并操作其外部作用域中的变量。闭包在Go中广泛用于实现函数式编程模式、状态保持和回调等场景。

基本概念

闭包是一个函数值,它引用了函数体之外的变量。这个函数可以访问并修改这些外部变量,也就是说函数"绑定"了这些变量。这个函数和这些变量共同组成闭包。

闭包示例

func main() {x := 10// 这是一个闭包,它捕获了外部变量xadd := func(y int) int {return x + y}fmt.Println(add(5)) // 输出15x = 20fmt.Println(add(5)) // 输出25,闭包能看到x的变化
}

在这里插入图片描述

闭包的核心特性

1、变量捕获:闭包可以捕获并持有外部作用域的变量。

2、状态保持:被捕获的变量在闭包调用间保持其状态。

3、独立实例:每次创建闭包都会生成一个新的独立环境。

闭包的典型使用场景

1. 计数器/生成器模式

counter代码解析:定义了一个名为counter的函数,没有参数,返回值为fun() int。

func counter() func() int {i := 0return func() int {i++return i}
}func main() {c1 := counter()fmt.Println(c1()) // 1fmt.Println(c1()) // 2c2 := counter()fmt.Println(c2()) // 1 (新的实例)
}

2. 函数工厂

两个实例,两个闭包的string不相互影响。

func makeGreeter(prefix string) func(string) string {return func(name string) string {return prefix + ", " + name}
}func main() {hello := makeGreeter("Hello")hi := makeGreeter("Hi")fmt.Println(hello("Alice")) // Hello, Alicefmt.Println(hi("Bob"))      // Hi, Bob
}

3.中间件模式

func loggerMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {start := time.Now()next(w, r)log.Printf("%s %s took %v", r.Method, r.URL.Path, time.Since(start))}
}

闭包捕获的外部变量存储位置

在Go语言中,被闭包函数捕获的外部变量存储在堆(heap)上,而不是栈(stack)上。这是Go闭包实现的一个重要特性。

存储机制详解

Go编译器会进行逃逸分析,确定变量的存储位置。当变量被闭包引用时,编译器会判定它"逃逸"到了堆上。这是为了保证变量的生命周期能够延长到闭包的使用期。
编译器会将被捕获的变量和闭包函数打包成一个结构体,这个结构体会分配在堆内存中闭包函数通过这个结构体来访问被捕获的变量。

被闭包捕获的外部变量的修改影响范围

被闭包捕获的外部变量的修改是否会影响所有实例,取决于闭包的创建方式。具体分为两种情况:
1、多个闭包共享同一个外部变量(会影响)。
2、每次调用生成独立的闭包实例(不会影响)。

1. 多个闭包共享同一个外部变量(会影响)

当多个闭包捕获的是同一个外部变量时,修改该变量会影响所有相关的闭包实例。

func main() {var i int = 0// 两个闭包捕获同一个i变量incr := func() { i++ }get := func() int { return i }fmt.Println(get()) // 0incr()fmt.Println(get()) // 1 (两个闭包看到的是同一个i)
}

2. 每次调用生成独立的闭包实例(不会影响)

当每次函数调用都创建新的变量和闭包时,各个闭包实例拥有自己的变量副本,互不影响。

func counter() func() int {i := 0 // 每次调用counter()都会创建新的ireturn func() int {i++return i}
}func main() {c1 := counter() // 有自己的ic2 := counter() // 有另一个独立的ifmt.Println(c1()) // 1 (c1的i)fmt.Println(c1()) // 2fmt.Println(c2()) // 1 (c2的i,不受c1影响)fmt.Println(c1()) // 3 (c1的i继续独立递增)
}

3.关键区分点

情况变量声明位置影响范围示例
共享变量闭包外部声明所有闭包实例共享多个闭包捕获同一个包级/函数级变量
独立变量闭包创建函数内部每个闭包实例独立像counter()工厂函数那样每次创建新变量

闭包底层原理

Go的闭包实现基于以下几点:

1、闭包函数会持有对外部变量的引用。

2、编译器会将闭包和它引用的外部变量打包成一个结构体。

3、当闭包被调用时,它会通过这个结构体访问外部变量。

底层实现示例(概念模型):

// 编译器生成的类似结构(实际实现更复杂)
type closureStruct struct {i int  // 被捕获的变量// 可能还有其他捕获的变量
}func counter() func() int {c := &closureStruct{i: 0}  // 分配在堆上return func() int {c.i++return c.i}
}

注意事项

1. 循环中的闭包陷阱

func main() {var funcs []func()for i := 0; i < 3; i++ {// 错误写法:所有闭包共享同一个ifuncs = append(funcs, func() { fmt.Println(i) })}for _, f := range funcs {f() // 全部输出3,不是预期的0,1,2}// 正确写法1:通过参数传递for i := 0; i < 3; i++ {i := i // 创建局部变量副本funcs = append(funcs, func() { fmt.Println(i) })}// 正确写法2:立即执行for i := 0; i < 3; i++ {func(i int) {funcs = append(funcs, func() { fmt.Println(i) })}(i)}
}

2. 并发安全问题

当多个goroutine访问同一个闭包变量时,需要加锁:

func safeCounter() func() int {var i intvar mu sync.Mutexreturn func() int {mu.Lock()defer mu.Unlock()i++return i}
}

3. 性能

闭包会延长被捕获变量的生命周期,可能导致内存占用增加,在性能敏感的场景需要谨慎使用。

http://www.dtcms.com/wzjs/58448.html

相关文章:

  • 做网站要买数据库精准引流怎么推广
  • wordpress 不需要审核seo广告投放
  • 深圳网站建设公司服务流程企业网站推广方案的策划
  • wordpress文章结构优化seo方法
  • 网页站点什么意思成品网站货源1
  • 江门有那几间公司做网站的seo搜索引擎优化工资
  • 建筑人才网官方网站入口培训机构网站
  • 网页设计与制作案例教程第二版班级优化大师使用指南
  • 化妆品产品的自建网站哟哪些app如何推广
  • yy简历网郑州seo排名扣费
  • 网站建设荣茂怎么申请网站详细步骤
  • 十年经验网站开发企业百度搜索引擎入口
  • 17网站一起做网店广州新塘如何进行搜索引擎营销
  • 哪些购物网站用php做的百度搜索引擎地址
  • 网站备案必须做吗新品牌进入市场的推广方案
  • 广州建设网站公司简介如何打百度人工电话
  • 买服务器做网站 镜像选什么怎样看网页的友情链接
  • wordpress 微网站模板b2b网站有哪些
  • 推荐西安知名的集团门户网站建设公司搜索引擎优化有哪些要点
  • 2017年网站推广怎么做合肥网络推广公司
  • 做衣服视频有些什么网站杭州推广公司
  • 济南个人网站建设搜索引擎的关键词优化
  • 男女做视频网站做一个私人网站需要多少钱
  • 淄博网站制作网页优化网络培训
  • 合优做网站需要多少钱智能建站模板
  • 长春商城网站建设软文标题大全
  • 网络公司网站赏析关键词排名监控
  • 绵阳阡陌网站建设游戏推广公司
  • 做二手车那个网站会员性价比高网络营销毕业论文范文
  • 南昌网站建设维护百度站长工具查询