• Go语言的跨文件调包


    一、前言

    文件的结构如下:

    .
    ├── go.mod
    ├── main
    │   └── main.go
    └── util
        └── util.go
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    二、前提知识点

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

    其中 go.mod

      1 module test                                                                                                                          
      2                                                                                                                                      
      3 go 1.21.0      
    
    • 1
    • 2
    • 3

    其中main.go

      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 }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    util.go

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

    执行

    ┌─[zhaoky@zhaoky][~/Desktop/kaiyue/module]
    └──╼ $go run ./main                                                                                                                      
    4
    
    • 1
    • 2
    • 3

    三、init()函数

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

      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 }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    此时执行main.go
    └──╼ $go run ./main                                                                                                                      
    hahahah
    4
    
    • 1
    • 2
    • 3
    • 4

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

    四、别名

    1、调用的包起别名

      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 }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    2、给未调用的包起别名

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

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

    ┌─[zhaoky@zhaoky][~/Desktop/kaiyue/module]
    └──╼ $go run ./main                                                                                                              
    hahahah
    1
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    计算机组成原理——中央处理器-指令执行过程(课程笔记)
    Ambari安装部署—基础软件环境说明
    前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化
    以太坊--2.账户是什么---以太坊的指南针学习记录
    突破传统显示技术,探索OLED透明屏的亮度革命
    第15章: 泛型
    用 TypeScript 类型运算实现一个五子棋游戏
    SRS、ZLMediakit音视频流媒体服务器
    锂电池行业走向数字化,B2B电商系统精益企业库存管控,实现仓储数字化管理
    谷粒商城 (十九) --------- 商品服务 概念 SPU & SKU
  • 原文地址:https://blog.csdn.net/qq_39852676/article/details/132747958