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. 闭包在输入某些固定先决条件时,可以更便于理解和使用,只需要传一次固定值
相关推荐
geovindu几秒前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
AC赳赳老秦4 分钟前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
CoderYanger5 分钟前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
酷酷的身影14 分钟前
Managers/APConfigManager.cs
开发语言·ui·c#
拳里剑气15 分钟前
C++算法:优先级队列
开发语言·c++·算法·优先级队列
小七在进步16 分钟前
数据结构:用队列实现栈
开发语言·数据结构
从零开始的代码生活_38 分钟前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
luj_17689 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏9 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
mCell9 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构