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

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. 闭包在输入某些固定先决条件时,可以更便于理解和使用,只需要传一次固定值
http://www.lryc.cn/news/609150.html

相关文章:

  • slice() 和 splice()
  • 决策树模型知识点整理:从原理到实战(含可视化与调参)
  • Corrosion2靶机练习笔记
  • 【图像处理基石】如何使用deepseek进行图像质量的分析?
  • 【Django】-9- 单元测试和集成测试(上)
  • Day23--回溯--39. 组合总和,40. 组合总和 II,131. 分割回文串
  • 机器人抓取流程介绍与实现——机器人抓取系统基础系列(七)
  • 深度学习中卷积与互相关
  • [ java Thread 线程 ] 由“一对一“到“一对多“
  • 【Linux网络编程基础--socket地址API】
  • 使用 Vuepress + GitHub Pages 搭建项目文档
  • GraphRAG:基于知识图谱的检索增强生成技术解析
  • 微分方程模型:用“变化率”的语言,描绘世间万物的动态演化
  • async/await和Promise之间的关系是什么?(补充)
  • 图像识别区分指定物品与其他物体
  • SelectDB数据库,新一代实时数据仓库的全面解析与应用
  • Kubernetes滚动更新、蓝绿部署与金丝雀发布方案对比分析及选型建议
  • 延迟任务方案-DelayQueue
  • noob靶机复现笔记
  • 【stm32】GPIO输入
  • 环绕字符串中的唯一子字符串-动态规划
  • 其它IO函数
  • STM32 串口发送
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘scikit-learn’问题
  • Linux环境下使用Docker搭建多服务环境
  • 学习游戏制作记录(实现克隆攻击的克隆复制和水晶代替克隆)8.3
  • 【gradle】插件那些事
  • 7.28-8.3周报
  • C的数据类型与变量
  • 高质量数据集|从武汉光谷《面向科技情报大模型的高质量数据集建设》招标项目谈起