当前位置:首页 > 科技  > 软件

Go 透明文件夹的特性,有没有必要加?

来源: 责编: 时间:2023-11-07 09:13:26 168观看
导读大家好,我是煎鱼。在 Go 语言中,我们一般会用模块(Module)和包(Package)来组织我们的项目、库的目录和代码结构。这也是官方所推荐的。今天给大家分享一个面向包这块的新提案,看看是否合适加进 Go 特性中?看看社区里不同人的

大家好,我是煎鱼。Qa928资讯网——每日最新资讯28at.com

在 Go 语言中,我们一般会用模块(Module)和包(Package)来组织我们的项目、库的目录和代码结构。这也是官方所推荐的。Qa928资讯网——每日最新资讯28at.com

今天给大家分享一个面向包这块的新提案,看看是否合适加进 Go 特性中?看看社区里不同人的想法。Qa928资讯网——每日最新资讯28at.com

前置知识:模块和包

具体来讲,模块(Module)就是 go mod 的应用。我们最常接触到的是以下命令:Qa928资讯网——每日最新资讯28at.com

mkdir my-projectcd my-projectgo mod init github.com/eddycjy/my-project

在执行了 go mod init 后会生成 go.mod 文件,如下所示:Qa928资讯网——每日最新资讯28at.com

// go.modmodule github.com/eddycjy/my-projectgo 1.21.1

这就是这个项目的模块。Qa928资讯网——每日最新资讯28at.com

对应到包(Package)中,会更加的直接和显性。我们一般会创建类似如下的目录结构:Qa928资讯网——每日最新资讯28at.com

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

Go 文件中的 package name,存在明确的约定俗成的标准,需要和目录名称保持一致。Qa928资讯网——每日最新资讯28at.com

例如:Qa928资讯网——每日最新资讯28at.com

// internals.gopackage internalsimport "fmt"func Hello() { fmt.Println("你好,煎鱼!")}

如果在其他地方中导入该包,则为:Qa928资讯网——每日最新资讯28at.com

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

以上就是模块和包的基础前置知识。我们接下来正式进入提案的正题。Qa928资讯网——每日最新资讯28at.com

提案:透明文件夹

针对 Go 程序的代码组织结构管理,最近社区有个同学提出了一个新提案:Qa928资讯网——每日最新资讯28at.com

图片图片Qa928资讯网——每日最新资讯28at.com

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

为此提出了 “透明文件夹” 的概念,通过使用诸如 Next.js 应用程序路由器中看到的 (folder) 或 _folder 之类的语义来表示。Qa928资讯网——每日最新资讯28at.com

这些文件夹可以在不创建新软件包的情况下组织软件包内的文件。它们将与软件包的根目录保持关系。Qa928资讯网——每日最新资讯28at.com

例子如下:Qa928资讯网——每日最新资讯28at.com

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 的包名就能进行引用。Qa928资讯网——每日最新资讯28at.com

简单来讲,该提案的实现方式是:通过将工程中 package name 和实体文件夹目录的作用分割开,目的是:提供一种纯粹的代码组织方式。Qa928资讯网——每日最新资讯28at.com

一些争议

其实类似的场景诉求,我有一个朋友曾经听几个同事吐槽过。但一般会是在比较大的 Go 项目中,例如出现以下场景:Qa928资讯网——每日最新资讯28at.com

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

会认为这样 package 切割的比较碎,但是不区分开。多了后在代码结构上又很容易繁杂化。所以会想有一种纯碎的代码组织方式。Qa928资讯网——每日最新资讯28at.com

争议也是有不少的。因为他对语言的 ROI 并不是太高,变动的东西(例如:工具、IDE、tests 等)会比较多。Qa928资讯网——每日最新资讯28at.com

只需将文件命名为:aaa-foo.go aaa-bar.go bbb-foo.go bbb-bar.go,而不是 aaa/foo.go aaa/bar.go bbb/foo.go bbb/bar.go。也能达到类似的效果。Qa928资讯网——每日最新资讯28at.com

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

总结

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

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

我认为反而会导致可读性会有所下降。Qa928资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17381-0.htmlGo 透明文件夹的特性,有没有必要加?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 想快速进入人工智能领域的Java程序员?你准备好了吗?

下一篇: 这五道JavaScript题,90%的开发者都做不出来

标签:
  • 热门焦点
Top