Go语言的跨文件调包

一、前言

文件的结构如下:

c 复制代码
.
├── go.mod
├── main
│   └── main.go
└── util
    └── util.go

文件在调用其它包的时候,需要在代码中引用其他的函数,包的命名一般都以小写为主,文件中函数的以首字符为大写的函数为共有函数,小写的为私有函数,只能是在同一个包中来回调用,公有函数可直接被其他包调用。

二、前提知识点

  1. 首字符大写的函数为共有,否则为私有
  2. import 导入其他包的时候组合方式为"模块名字/子路径 ",其中每个子路径中都是一个包,例如"test/util" test为go.mod文件中的模块名,util是该模块下的子文件夹,注意是子文件夹,不是子包的名称,子文件夹的名称可以和包名不同,例子中util文件夹下的包名为utils,在main.go中导入在子包的路径后,即可引用该包的函数。
  3. 执行go run ./main 即可,默认会在main的文件夹中搜索执行main()函数

其中 go.mod

c 复制代码
  1 module test                                                                                                                          
  2                                                                                                                                      
  3 go 1.21.0      

其中main.go

c 复制代码
  1 package main                                                                                                                         
  2                                                                                                                                      
  3 import (                                                                                                                             
  4     "fmt"                                                                                                                            
  5     "test/util"                                                                                                                      
  6 )                                                                                                                                    
  7                                                                                                                                      
  8                                                                                                                                      
  9 func main() {                                                                                                                        
 10     a := utils.Add(1, 3)                                                                                                             
 11     fmt.Println(a)                                                                                                                   
 12 }    

util.go

c 复制代码
  1 // util.go                                                                                                                           
  2 package utils                                                                                                                        
  3                                                                                                                                      
  4 func Add(a int, b int) int {                                                                                                         
  5  return a + b                                                                                                                        
  6 }  

执行

c 复制代码
┌─[zhaoky@zhaoky]─[~/Desktop/kaiyue/module]
└──╼ $go run ./main                                                                                                                      
4

三、init()函数

在以上的例子修改util.go文件:

c 复制代码
  1 // util.go                                                                                                                           
  2 package utils                                                                                                                        
  3                                                                                                                                      
  4 import "fmt"                                                                                                                         
  5                                                                                                                                      
  6 func Add(a int, b int) int {                                                                                                         
  7  return a + b                                                                                                                        
  8 }                                                                                                                                    
  9                                                                                                                                      
 10 func init(){                                                                                                                         
 11     fmt.Println("hahahah")                                                                                                           
 12 }  
c 复制代码
此时执行main.go
└──╼ $go run ./main                                                                                                                      
hahahah
4

其中init()函数会在main()函数中使用import调用"test/util" 时候会顺序执行。

四、别名

1、调用的包起别名

c 复制代码
  1 package main                                                                                                                         
  2                                                                                                                                      
  3 import (                                                                                                                             
  4     "fmt"                                                                                                                            
  5     lala "test/util"                                                                                                                 
  6 )                                                                                                                                    
  7                                                                                                                                      
  8                                                                                                                                      
  9 func main() {                                                                                                                        
 10     a := lala.Add(1, 3)                                                                                                              
 11     fmt.Println(a)                                                                                                                   
 12 }  

main.go文件中给路径test/util下的utils的包重新别名为lala

2、给未调用的包起别名

c 复制代码
  1 package main                                                                                                                         
  2                                                                                                                                      
  3 import (                                                                                                                             
  4     "fmt"                                                                                                                            
  5     _ "test/util"                                                                                                                 
  6 )                                                                                                                                    
  7                                                                                                                                      
  8                                                                                                                                      
  9 func main() {                                                                                                                                                                                                                                    
 10     fmt.Println(1)                                                                                                                   
 11 }  

注意 :在没有调用该包的函数时,如果import中引用了,此时会报错,如果起别名为_ 则不会报错,但不会影响utils包中的init()的函数执行。

c 复制代码
┌─[zhaoky@zhaoky]─[~/Desktop/kaiyue/module]
└──╼ $go run ./main                                                                                                              
hahahah
1
相关推荐
JQLvopkk9 分钟前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
玄同76523 分钟前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy878747525 分钟前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-194329 分钟前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq19820430115630 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class31 分钟前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs33 分钟前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&34 分钟前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
BD_Marathon1 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
devmoon1 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡