Go 面向包新提案透明文件夹必要性分析

 更新时间:2023年11月08日 09:41:40   作者:煎鱼  
这篇文章主要为大家介绍了Go 面向包新提案,透明文件夹必要性分析,看看是否合适加进 Go 特性中,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在 Go 语言中,我们一般会用模块(Module)和包(Package)来组织我们的项目、库的目录和代码结构。

今天给大家分享一个面向包这块的新提案,看看是否合适加进 Go 特性中?

前置知识:模块和包

具体来讲,模块(Module)就是 go mod 的应用。我们最常接触到的是以下命令:

mkdir my-project
cd my-project
go mod init github.com/eddycjjy/my-project

在执行了 go mod init 后会生成 go.mod 文件,如下所示:

// go.mod
module github.com/eddycjy/my-project

go 1.21.1

这就是这个项目的模块。

对应到包(Package)中,会更加的直接和显性。我们一般会创建类似如下的目录结构:

<my-project>
  -<cli>
    --cli.go
  -<internals>
    --internals.go
  --go.mod
  --main.go

Go 文件中的 package name,存在明确的约定俗成的标准,需要和目录名称保持一致。例如:

// internals.go
package internals
import "fmt"
func Hello() {
 fmt.Println("你好,煎鱼!")
}

如果在其他地方中导入该包,则为:

import (
 ...
 "github.com/eddycjy/my-project/internals"
)

以上就是模块和包的基础前置知识。我们接下来正式进入提案的正题。

提案:透明文件夹

针对 Go 程序的组织结构管理,最近社区有个同学提出了一个新提案:

在 Go 里文件夹默认与包(Package)的关系是划等号的。虽然这很方便,但是提案作者反馈:在某些情况下,我们需要通过文件夹来实现纯粹的组织和可读性目的,而不想引入新的包

为此提出了 “透明文件夹” 的概念,通过使用诸如 Next.js 应用程序路由器中看到的 (folder) 或 _folder 之类的语义来表示。

这些文件夹可以在不创建新软件包的情况下组织软件包内的文件。它们将与软件包的根目录保持链接。

例子如下:

myapp
  main.go
  myTypes.go
  (routes)
     handleRoot.go
     handleMultipart.go
     ...
  db
     connect.go
     dbTypes.go
     (auth)
         strategy1.go
         strategy2.go
         ...

可以看到这个例子,他使用 (folder) 的方式来表示透明文件夹。例如:(routes) 和 (auth),这样他就不需要再细分不同的 package name,统一用 myapp 和 db 的包名就能进行引用。

简单来讲,该提案的实现方式是:通过将工程中 package name 和实体文件夹目录的作用分割开,目的是:提供一种纯粹的代码组织方式。

一些争议

其实类似的场景诉求,我有一个朋友曾经听几个同事吐槽过。但一般会是在比较大的 Go 项目中,例如出现以下场景:

myapp
  service
    a-service
    b-service
    c-service
    ...

会认为这样 package 切割的比较碎,但是不区分开。多了后在代码结构上又很容易繁杂化。所以会想有一种纯碎的代码组织方式。

争议也是有不少的。因为他对语言的 ROI 并不是太高,变动的东西(例如:工具、IDE、tests 等)会比较多。

只需将文件命名为:aaa-foo.go aaa-bar.go bbb-foo.go bbb-bar.go,而不是 aaa/foo.go aaa/bar.go bbb/foo.go bbb/bar.go。也能达到类似的效果。

也有表示添加透明子文件夹会让一切变得更加复杂,却没有任何好处。把文件放在它们应该在的地方就可以了。现在已经在其他语言中看到过这种替代方法,很糟糕。

总结

这个提案本身的出发点很常见,因为 package name 和代码目录结构绑定了,会导致在设计代码结构时会有些受限,最终受此引导拆 package 来形成结构化。

如果盲目的添加透明文件夹,反而会出现一个尴尬的问题。因为 Go 语言在这块是非常直接的,添加了这类模式,大家反而会没法笃定,要去看看项目的代码结构才能确定。

以上就是Go 面向包新提案透明文件夹必要性分析的详细内容,更多关于Go 透明文件夹的资料请关注脚本之家其它相关文章!

相关文章

  • golang与非golang程序探测beyla源码解读

    golang与非golang程序探测beyla源码解读

    这篇文章主要为大家介绍了beyla源码解读之golang与非golang程序的探测实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang使用zlib压缩和解压缩字符串

    Golang使用zlib压缩和解压缩字符串

    本文给大家分享的是Golang使用zlib压缩和解压缩字符串的方法和示例,有需要的小伙伴可以参考下
    2017-02-02
  • Go语言处理超大字符串型整数加减经典面试详解

    Go语言处理超大字符串型整数加减经典面试详解

    这篇文章主要为大家介绍了Go语言处理超大字符串型整数加减经典面试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • go写文件后出现大量NUL字符问题解决

    go写文件后出现大量NUL字符问题解决

    本文主要介绍了go写文件后出现大量NUL字符问题解决,由于每次写的时候设置的长度都是64,在某次不足64时,byte切片空余位置被填充为空字符,下面就来介绍一下如何解决
    2023-12-12
  • Go语言包管理模式示例分析

    Go语言包管理模式示例分析

    这篇文章主要为大家介绍了Go语言包管理模式示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • golang中定时器cpu使用率高的现象详析

    golang中定时器cpu使用率高的现象详析

    这篇文章主要给大家介绍了关于golang中定时器cpu使用率高的现象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 一文带你了解Go语言中time包的时间常用操作

    一文带你了解Go语言中time包的时间常用操作

    在日常开发中,我们避免不了时间的使用,我们可能需要获取当前时间,然后格式化保存,也可能需要在时间类型与字符串类型之间相互转换等。本文将会对 Go time 包里面的常用函数和方法进行介绍,需要的可以参考一下
    2022-12-12
  • GO中sync包自由控制并发示例详解

    GO中sync包自由控制并发示例详解

    这篇文章主要为大家介绍了GO中sync包自由控制并发示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 基于Go和PHP语言实现爬楼梯算法的思路详解

    基于Go和PHP语言实现爬楼梯算法的思路详解

    这篇文章主要介绍了Go和PHP 实现爬楼梯算法,本文通过动态规划和斐波那契数列两种解决思路给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 浅谈Golang的new与make区别是什么

    浅谈Golang的new与make区别是什么

    本文主要介绍了Golang的new与make区别是什么,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论