Go语言中的包Package详解

 更新时间:2022年07月16日 14:21:22   作者:奋斗的大橙子  
本文详细讲解了Go语言中的包Package,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

问题一、Go使用Package组织源码的好处是什么?

1.任何源码属于一个包

2.用包组织便于代码的易读和复用

问题二、Go语言中Package的种类

Go语言中存在两种包、一种是可执行程序的包、一种是类库函数的包。

可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件,自己不能执行只能被可执行包引用。

可执行程序的包必须以main作为包名,静态库的包名没有要求。

例如下面的实例:landlords存在如下几层结构 dal层、logic层、main以及proto层

可以看到编辑后的结果是,生成了一个db.a数据库访问的库、redis.a 缓存访问的库、logic.a 业务逻辑层的库 以及一个proto.a 协议层的库(websocket.a 是由于引用了github.com下面的包),main包最终编译成了一个可执行文件。

main包和其他类库通过静态链接,最终形成的可执行文件是没有任何外部依赖的。

补充:如何生成一个静态库的包。

打比方我创建了如下的项目,现在有这样一个包,我想要在main里面引用它。

必须使用 go install 命令,生成一下package,发现报错了。因为我没有配置gopath,所以命令报错了。

还有一个关键原因就是,我这个项目不是建立在GoPath下Src目录的,所以go install就用不了。

这也是问题的关键,就是我们在创建项目的时候,需要先配置一个GoPath加入到环境变量当中,然后里面新建三个文件夹src、pkg以及bin文件夹,然后在src下面建立自己的项目。

我把改项目,放到了一个GoPath的src目录下,重新go install之后,在对应的pkg文件夹下生成了 calc.a文件。

然后我们就可以在main中引用这个包了,如下:

package main

import ( 
    "PackageDemo/Calc" 
    "fmt" 
) 

func main(){ 
    var a,b int = 3,1 
    var add = Calc.Add(a,b)
    var min = Calc.Min(a,b) 
    fmt.Println("Add result:",add) 
    fmt.Println("Min result",min) 
}

问题三、包引用和init函数的执行顺序问题。

一个包引用另一个包的初始化顺序,像下面的这个流程,main引用了add包,add包引用了sub包。

是从底层还是初始化的。

add.go

package add
 
import (
   "fmt"
   "PackageDemo/sub"
)
 
func init(){
   fmt.Println("我是add包的init函数")
}
 
func Add(){
   sub.Sub()
}

sub.go

package sub
 
import "fmt"
 
func init(){
  fmt.Println("我是sub包的init函数")
}
 
func Sub(){
  fmt.Println("")
}

main.go

package main
 
import (
  "fmt"
  "PackageDemo/add"
)
 
func init(){
  fmt.Println("我是Main里面的init函数")
}
 
func main(){
   add.Add()
}

结果:

到此这篇关于Go语言包Package的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Go中的 panic / recover 简介与实践记录

    Go中的 panic / recover 简介与实践记录

    这篇文章主要介绍了Go中的 panic / recover 简介与实践,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • golang修改结构体中的切片值方法

    golang修改结构体中的切片值方法

    这篇文章主要介绍了golang修改结构体中的切片值方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Go语言Gin框架前后端分离项目开发实例

    Go语言Gin框架前后端分离项目开发实例

    本文主要介绍了Go语言Gin框架前后端分离项目开发工程化实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Golang泛型的使用方法详解

    Golang泛型的使用方法详解

    这篇文章主要介绍了Golang中泛型的使用,Go和Python语言不同,处理不同数据类型非常严格。如Python可以定义函数带两个数值类型并返回较大的数值,但可以不严格指定参数类型为float或integer
    2022-12-12
  • Go defer 去掉闭包函数及用法分析

    Go defer 去掉闭包函数及用法分析

    这篇文章主要为大家介绍了Go defer 去掉闭包函数及用法分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • golang接口IP限流,IP黑名单,IP白名单的实例

    golang接口IP限流,IP黑名单,IP白名单的实例

    这篇文章主要介绍了golang接口IP限流,IP黑名单,IP白名单的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言单控制器和多控制器使用详解

    Go语言单控制器和多控制器使用详解

    这篇文章主要为大家详细介绍了Go语言单控制器和多控制器的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Go语言实战之切片内存优化

    Go语言实战之切片内存优化

    Go 语言的切片是一个动态的数据结构,可以方便地对其进行扩容和缩容操作。这篇文章主要为大家详细介绍了Go语言如何实现切片内存优化,需要的可以参考一下
    2023-03-03
  • Go位集合相关操作bitset库安装使用

    Go位集合相关操作bitset库安装使用

    这篇文章主要为大家介绍了Go位集合相关操作bitset库安装使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go语言编程中对文件读写的基本方法整理

    Go语言编程中对文件读写的基本方法整理

    这篇文章主要介绍了Go语言编程中对文件读写的基本方法整理,是Go语言入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10

最新评论