脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Go 语言为什么不支持从 main 包中导入函数?

Go 语言为什么不支持从 main 包中导入函数?

2024-03-12 15:27Go语言圈 Golang

Go 语言不支持从 main 包中导入函数是为了保持代码的封装性、可测试性和模块化。我们应该将功能函数放在适当的包中,并在需要时从其他包中导入它们。这样可以提高代码的质量、可维护性和可重用性。

作为一个维护过许多有一定历史沉淀的 Go 项目的人,在历史债务下和奇葩需求下,会遇到一些迫于业务需求的技术诉求。

诉求上是希望引用多项目,会出现从 main 包(package)中导入相关函数的这种使用诉求。为了将多 Go 工程合并到一个大单体中使用。

Go 为什么不支持从 main 包中导入函数

Go 语言确实不支持从 main 包中导入函数,这主要是出于包管理和模块化的考虑。main 包在 Go 中具有特殊的地位,它是程序的入口点,即程序的执行从这里开始。main 包通常只包含一个 main 函数,这是 Go 应用程序的入口点。

不支持从 main 包导入函数的原因有以下几点:

  • 封装性:main 包是程序的入口点,通常只包含程序启动所需的最小代码。将其他功能放在 main 包中会导致代码结构混乱,不利于封装和重用。
  • 可测试性:如果 main 包包含其他功能函数,那么这些函数将很难进行单元测试,因为它们与程序的启动和退出紧密相关。
  • 模块化:Go 语言鼓励将代码组织成多个包,每个包负责特定的功能。这样可以将代码划分为更小的、更易于管理的模块,提高代码的可读性和可维护性。

下面通过几个例子来说明为什么 Go 不支持从 main 包中导入函数:

代码结构混乱

假设我们有一个 main 包,其中不仅包含 main 函数,还包含其他功能函数:

// main.go  
package main  

import "fmt"  

func helperFunction() {  
    fmt.Println("Helper function called")  
}  

func main() {  
    helperFunction()  
    // 其他程序逻辑...  
}

在这个例子中,helperFunction 被定义在 main 包中。如果我们想在其他包中使用这个函数,就需要将其移动到另一个包中,否则无法导入和使用。

测试困难

假设我们将 helperFunction 放在了 main 包中,并尝试为其编写单元测试:

// main_test.go  
package main  

import "testing"  

func TestHelperFunction(t *testing.T) {  
    helperFunction()  
    // 断言和验证...  
}

由于 main 包与程序的启动和退出紧密相关,测试 main 包中的函数可能会受到程序状态、命令行参数、环境变量等多种因素的影响,导致测试不稳定或难以编写。

模块化不足

如果我们将所有代码都放在 main 包中,那么代码将很难进行模块化拆分。随着项目规模的扩大,代码将变得难以管理和维护。

通过将代码拆分为多个包,我们可以更好地组织代码,提高代码的可读性和可维护性。

总结

Go 语言不支持从 main 包中导入函数是为了保持代码的封装性、可测试性和模块化。

我们应该将功能函数放在适当的包中,并在需要时从其他包中导入它们。这样可以提高代码的质量、可维护性和可重用性。

原文地址:https://mp.weixin.qq.com/s/gIxTYyOm7yBMlX9JY6c_3Q

延伸 · 阅读

精彩推荐
  • GolangGolang中struct{}和struct{}{}的区别解析

    Golang中struct{}和struct{}{}的区别解析

    这篇文章主要介绍了Golang中struct{}和struct{}{}的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    路多辛8822023-03-19
  • GolangGo语言中接口组合的实现方法

    Go语言中接口组合的实现方法

    这篇文章主要介绍了Go语言中接口组合的实现方法,实例分析了接口中包含接口的实现技巧,需要的朋友可以参考下 ...

    脚本之家5192020-04-13
  • Golang解决go build不去vendor下查找包的问题

    解决go build不去vendor下查找包的问题

    这篇文章主要介绍了解决go build不去vendor下查找包的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    zgcbj14492021-03-08
  • GolangGolang实现超时退出的三种方式

    Golang实现超时退出的三种方式

    这篇文章主要介绍了Golang三种方式实现超时退出,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 ...

    JackieZheng2952020-06-08
  • Golanggo格式“占位符”输入输出 类似python的input

    go格式“占位符”输入输出 类似python的input

    这篇文章主要介绍了go格式“占位符”, 输入输出,类似python的input,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 ...

    听砜4812020-05-25
  • GolangGo语言非main包编译为静态库并使用的示例代码

    Go语言非main包编译为静态库并使用的示例代码

    本文以Windows为例,介绍一下如何将Go的非main包编译为静态库,用户又将如何使用。通过实际项目创建常规工程,通过示例代码给大家介绍的非常详细,需要...

    witton12302021-08-14
  • GolangGolang清晰代码指南

    Golang清晰代码指南

    清晰的代码是对您的同行开发者和未来自己的一种尊重方式。它导致更高效、更愉快的软件开发,减少了挫折感,并有助于项目的整体成功。...

    技术的游戏5542023-12-18
  • GolangGo测试的20个实用建议,你采纳了吗?

    Go测试的20个实用建议,你采纳了吗?

    2023年11月初,Go语言技术负责人Russ Cox在GopherCon Australia 2023[1]大会上进行了题为“Go Testing By Example”[2]的演讲: 图片 12月初Russ Cox重新录制了该演讲内容的视...

    TonyBai6952024-01-02