golang的包和闭包

包

  1. 在实际开发中,往往把一系列同类型的函数放在一个包里,比如说都跟数据库有关的,都跟登录有关的之类,便于管理,控制函数,变量的范围
    此时,要想其它文件使用这些函数,就需要引入包
  2. 多人共同开发时,在不同包里,有同名函数,是完全可以的
  3. go的每一个文件都属于一个包

如何引入

例如一个包名为util

引入时就是

import 包的路径

用包的函数时,util.函数名(这里的函数名首字母要大写,使该函数可导出,也就是其它语言所说的public,可以不同包间互相调用)

使用细节

  1. 包名常常与文件夹名一致,也可以不同,常小写
  2. 包可以有别名,当包名较长时,我们往往会选择使用别名,如果给了别名,原名就不能够使用了
    代码示例:
    import(
    util "包的路径"
    )
    那么这个包的别名就是util
  3. 在同一个包中的不同文件,不能有同名函数和全局变量
  4. 如果要编写可执行文件,就需要将包声明为main,即package main,这是语法规范,如果是写库,包名可以自定义

闭包

基本介绍

闭包:指的是一个函数 和与其相关的引用环境 ,所组合而成的一个整体(实体)

说通俗些:一个函数,和用到函数外的一些变量,共同组成一个整体就叫闭包

讲解

由于闭包略显抽象,以案例讲解

代码本例:

func AddUpper() func(int) int {

var n = 10

return func(x int) int {

n = n + x

return n

}

}

func main() {

f := AddUpper()

fmt.Println(f(1))

fmt.Println(f(2))

fmt.Println(f(3))

}

输出结果为:

11

13

16

说明:

  1. AddUpper是一个函数,而它的返回值是func(int) int
  2. 上面这段代码中,作为闭包的部分是:
    var n = 10
    return func(x int) int {
    n = n + x
    return n
    }
    这里返回了一个匿名函数,但是这个匿名函数里面引用到了函数外的n,因此这个匿名函数就和这个n形成一个整体,构成闭包
  3. 一个理解思路:将闭包视作一个类,而函数则是这个类的一个操作,n是字段
  4. 上述这段代码中,虽然f函数执行了三次,但是n的初始化只进行了开头一次,每次调用进行的都是累加操作
  5. 要想弄清闭包的关键,就要分析返回的函数它使用的(引用)到哪些变量,因为这些变量和这个函数本身共同构成闭包

闭包的代码示例,与好处分析

func makeSuffix(suffix string) func(string) string {

return func(name string) string {

if strings.HasSuffix(name, suffix) {

return name

} else {

return name + suffix

}

}

}

func main() {

//返回一个闭包

f := makeSuffix(".jpg")

fmt.Println(f("lsh"))

fmt.Println(f("lshsasda.jpg"))

}

  1. 这段代码中的匿名函数,和makeSuffix函数的suffix值构成了一个闭包,因为这个匿名函数引用了这个suffix值
  1. 闭包在输入某些固定先决条件时,可以更便于理解和使用,只需要传一次固定值
相关推荐
唐青枫14 分钟前
企业知识库 RAG 实战:混合检索、权限过滤与答案溯源
后端
花椒技术16 分钟前
花椒 AI 应用工程化实践:灵泡泡的工作流、版本管理与任务恢复
后端·agent·ai编程
小成2023032026519 分钟前
C++~02运算符重载
开发语言·c++
emfuture28 分钟前
龙芯2K300 PLC 在拉丝机收线系统改造中的应用:硬件选型、张力控制与国产化替代实践
java·开发语言·智能制造·plc·国产化替代
geovindu42 分钟前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
传奇开心果编程1 小时前
【Rust入门练中学】第8课:错误处理
开发语言·rust·错误处理·编程语言理论·通用编程语言
Doker 多克1 小时前
Spring Integration AMQP 和 Spring AMQP详解
java·后端·spring
韩振方1 小时前
Kubernetes Ingress 用 TLS Secret 给预览域名接上 HTTPS
后端
郑同学的笔记1 小时前
【c++随笔30】C++ 注册回调函数
开发语言·c++
用户1494484813201 小时前
为什么大厂很少直接用 2PC/TCC?聊聊分布式事务在真实业务里的落地套路
分布式·后端