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. 闭包在输入某些固定先决条件时,可以更便于理解和使用,只需要传一次固定值
相关推荐
绝无仅有12 分钟前
Go Timer 面试指南:常见问题及答案解析
后端·算法·架构
绝无仅有19 分钟前
Go 语言面试指南:常见问题及答案解析
后端·面试·go
bobz96526 分钟前
containerd (管理) 和 runc (执行)分离
后端
你我约定有三27 分钟前
面试tips--java--equals() & hashCode()
java·开发语言·jvm
bobz96539 分钟前
Docker 与 containerd 的架构差异
后端
程序猿阿伟39 分钟前
《跳出“技术堆砌”陷阱,构建可演进的软件系统》
后端
努力也学不会java1 小时前
【设计模式】简单工厂模式
java·开发语言·设计模式·简单工厂模式
就叫飞六吧1 小时前
基于Spring Boot的短信平台平滑切换设计方案
java·spring boot·后端
bobz9652 小时前
NVIDIA Container Toolkit(容器运行时依赖)
后端
bobz9652 小时前
NVIDIA Container Toolkit 架构上下文
后端