go mod依赖管理

简介: 本文介绍了Go语言中如何管理并使用自己的包以及导入第三方包的方法。内容涵盖包的目录结构、go.mod文件的初始化、import的正确使用方式、init函数的作用及执行顺序,以及如何下载和管理第三方库。通过具体示例演示了包的导入、别名设置、函数调用和运行方式,帮助开发者更好地理解和掌握Go模块化编程的核心技巧。

1. 管理并使用自己的包

1.1 情景假设

假设项目目录如下:

go

体验AI代码助手

代码解读

复制代码

 project
     |__go.mod
     |__src
         |__main.go
         |__utils
             |__query.go

go.mod文件如下:

bash

体验AI代码助手

代码解读

复制代码

 mudule test
 
 go 1.17

main.go文件如下:

go

体验AI代码助手

代码解读

复制代码

 package main
 
 import(
     "fmt"
 )
 
 
 func main(){
     ...
 }

query.go文件如下:

go

体验AI代码助手

代码解读

复制代码

 package utils   
 
 func Query(){
     ...
 }

1.2 导入utils包中的Query函数

1.2.1 确保go.mod文件存在

导入包的时候,首先保证你的项目拥有go.mod文件,同时保证你的go.mod文件已被初始化,若没有,请用:go mod init 模块名的命令来创建go.mod文件。

bash

体验AI代码助手

代码解读

复制代码

 go mod init test

1.2.2 确保被导入的函数名大写

导入包并想使用函数或者变量时,确保你的函数或变量的首字母大写,使其成为导出变量或函数。

1.2.3 如何import包

import的时候,从项目模块名开始,一级一级目录往下写。(也就是包的路径

例如utils目录下的文件,你应该导入的是test/src/utils,即

go

体验AI代码助手

代码解读

复制代码

 import(
     "fmt"
     "test/src/utils"
 )

注意:导入的最后一级是文件夹名,不是包名。若文件夹名改成hello,则import的也应该是test/src/hello

1.2.4 如何使用函数

使用函数应该用包名.函数名的方式使用,具体如下:

go

体验AI代码助手

代码解读

复制代码

 package main
 
 import(
     "fmt"
     "test/src/utils"
 )
 
 func main() {
     utils.Query()
 }
Tips:import取别名

你可以给import的包路径取别名,此时你后续使用就能用别名.函数名的方式调用。例如:

go

体验AI代码助手

代码解读

复制代码

 import(
     "fmt"
     hello "test/src/utils"
 )
 
 func main() {
     hello.Query()   //utils.Query()
 }

1.2.5 运行main函数

运行main函数时,使用go run main函数地址的方式。无需指定到go文件,只需指定到所在目录即可。

arduino

体验AI代码助手

代码解读

复制代码

 go run ./src

2. 如何导入第三方包

假设需要导入字节跳动的json序列化库:github.com/bytedance/s…

go

体验AI代码助手

代码解读

复制代码

 package main
 
 import(
     "fmt"
 )
 
 func main() {
     ...
     //此处需要sonic.Marshal()
 }

2.1 如何写import

从网址里的github.com开始,将后续的内容复制,写道import里:

go

体验AI代码助手

代码解读

复制代码

 import(
     "fmt"
     "github.com/bytedance/sonic"
 )

2.2 如何下载第三方包

import仅仅是将代码写好了,接下来还需要将该第三方包下载到本地使用。

方法1:go get 地址

方法是在命令行使用go get 地址的方式下载:

arduino

体验AI代码助手

代码解读

复制代码

 go get github.com/bytedance/sonic

此时,你的go mod里会生成require部分的内容,同时还会多出一个go.sum文件。(这些都不用关心,是自动完成的)

方法2:go mod tidy

也可以直接使用go mod tidy命令,无需写入地址,结果与上面一致。

go

体验AI代码助手

代码解读

复制代码

 go mod tidy

3. 其它补充内容

3.1 init函数

每一个包下,都可以放置一个特殊的函数:init函数。init函数是导入一个包时自动执行的代码,不需要显式调用。(在main函数执行前完成的)

注意:

  1. init函数没有参数和返回值。
  2. init函数在一个包里可以存在多个。
  3. init函数调用顺序是:按照import的顺序执行,同一包里按照上下的顺序执行。

3.1.1 情景假设

例如还是一开始的目录结构。

go

体验AI代码助手

代码解读

复制代码

 project
     |__go.mod
     |__src
         |__main.go
         |__utils
             |__query.go

main.go

go

体验AI代码助手

代码解读

复制代码

 package main
 
 import(
     "fmt"
     "test/src/utils"
 )
 
 func main() {
     utils.Query()
 }

query.go

go

体验AI代码助手

代码解读

复制代码

 package utils   
 
 import "fmt"
 
 func Query(){
     ...
 }
 
 func init() {
     fmt.Println("init utils 1")
 }
 
 func init() {
     fmt.Println("init utils 2")
 }

3.1.2 结果

下面是命令以及执行结果:

csharp

体验AI代码助手

代码解读

复制代码

 go run ./src
 
 init utils 1
 init utils 2
 ...

3.2 不引用函数,但保留import

这种情况用于:为了调用该包中的init函数,但是不需要引用包里的其它函数的情况。

方法:下划线别名

只需要在import这个包的时候,在前面用下划线_作为别名即可。

go

体验AI代码助手

代码解读

复制代码

 package main
 
 import(
     "fmt"
     _ "test/src/utils"
 )
 
 func main() {
     ...
 }

在这种情况下,init函数依旧会执行,同时也不会报错:没有引用包中的函数。


转载来源:https://juejin.cn/post/7259742949994528827

相关文章
|
4月前
|
XML 人工智能 监控
SpringBoot实战:七种统计方法耗时的实现方式
在Spring Boot开发中,统计方法执行时间是性能优化的重要手段。本文介绍了七种实现方法耗时统计的技巧,包括手动使用StopWatch、AOP全局监控、自定义注解+切面、拦截器、Filter、Actuator+Micrometer集成以及事件监听等方式。每种方法适用于不同场景,开发者可根据需求选择合适的方案,从而更高效地定位性能瓶颈并提升系统响应速度。
781 5
|
7月前
|
网络协议 前端开发 数据可视化
Apipost免费版、企业版和私有化部署详解
Apipost 是企业级 API 研发协作一体化平台,提供 API 研发、测试、管理全链路解决方案。支持多种协议(HTTP(s)、WebSocket、gRPC 等),助力团队实时协作、降本增效。免费版适合小微团队,具备 API 设计、调试、自动化测试和文档功能;企业版强化全链路资产管理与管控,支持复杂场景测试。此外,私有化部署方案保障数据安全,提供定制化服务与专业支持,满足内网需求企业的要求。
|
7月前
|
测试技术 Python
Python 的 for-else 循环结构是如何工作的?
本文介绍了Python中不太为人熟知但实用的`for-else`循环结构。通过示例讲解了其工作原理:当`for`循环正常结束而未遇到`break`时,执行`else`块。文章提供了两个应用场景——检查素数和列表搜索,帮助理解如何高效使用该结构。最后提醒,若无需条件跳出循环,普通`for`循环已足够。
362 33
|
5月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
247 0
|
5月前
|
算法 安全 Go
如何通过 go 语言实现雪花算法?
在Go语言中,可通过实现雪花算法(Snowflake)生成分布式唯一ID。该算法由Twitter提出,将64位ID分为时间戳、机器ID和序列号三部分。文章介绍了算法结构、Go语言实现代码、代码说明、示例输出、优点及注意事项。此算法具备高性能、分布式支持和有序性特点,适用于数据库主键等场景。使用时需确保机器ID唯一与时钟同步。
153 0
|
7月前
|
安全 Java 程序员
巧用Optional之优雅规避NPE问题
本文探讨了Java中常见的NullPointerException问题及其解决方案,重点介绍了Optional类的使用。通过实例代码分析,展示了如何用Optional替代传统的空值检查,使代码更简洁、优雅。文章详细讲解了Optional的创建方法(如of、ofNullable、empty)及常用方法(如get、orElse、map、flatMap、filter),并通过实战案例演示了其在实际开发中的应用,帮助开发者有效避免NPE问题,提升代码质量。
197 2
巧用Optional之优雅规避NPE问题
|
9月前
|
消息中间件 Java API
深入简出的带你精通java线程
线程与进程是操作系统中的两个重要概念。进程是资源分配的最小单位,负责加载指令、管理内存和IO;线程是CPU调度的最小单位,也被称为轻量级进程。
192 36
深入简出的带你精通java线程
|
8月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
202 17
|
8月前
|
安全 Java C#
使用try-with-resources实现自动解锁
本文介绍了如何利用Java的`try-with-resources`语法糖实现Redission分布式锁的自动解锁。通过将锁包装为实现了`AutoCloseable`接口的类,在`try`语句块结束时自动释放锁,简化了锁管理,避免了手动解锁的繁琐和潜在错误。示例代码展示了具体的实现方法,并分析了其优点和注意事项。这种模式提高了代码的简洁性、可靠性和可维护性,特别适用于多线程编程中的并发控制。
179 5
|
8月前
|
监控 Java API
JDK动态代理和CGLIB动态代理
Java动态代理允许在运行时创建代理对象,增强或拦截目标类方法的执行。主要通过两种方式实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,利用`java.lang.reflect.Proxy`类和`InvocationHandler`接口;CGLIB则通过字节码技术生成目标类的子类作为代理,适用于未实现接口的类。两者均用于在方法执行前后添加额外逻辑,如日志记录、权限控制等,广泛应用于AOP框架中。
317 2