掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我是煎魚。

站在用戶的角度思考問題,與客戶深入溝通,找到海城網(wǎng)站設(shè)計與海城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋海城地區(qū)。
在 Go 語言中,我們一般會用模塊(Module)和包(Package)來組織我們的項目、庫的目錄和代碼結(jié)構(gòu)。這也是官方所推薦的。
今天給大家分享一個面向包這塊的新提案,看看是否合適加進 Go 特性中?看看社區(qū)里不同人的想法。
具體來講,模塊(Module)就是 go mod 的應(yīng)用。我們最常接觸到的是以下命令:
mkdir my-project
cd my-project
go mod init github.com/eddycjy/my-project
在執(zhí)行了 go mod init 后會生成 go.mod 文件,如下所示:
// go.mod
module github.com/eddycjy/my-project
go 1.21.1
這就是這個項目的模塊。
對應(yīng)到包(Package)中,會更加的直接和顯性。我們一般會創(chuàng)建類似如下的目錄結(jié)構(gòu):
-
--cli.go
-
--internals.go
--go.mod
--main.go
Go 文件中的 package name,存在明確的約定俗成的標(biāo)準(zhǔn),需要和目錄名稱保持一致。
例如:
// internals.go
package internals
import "fmt"
func Hello() {
fmt.Println("你好,煎魚!")
}
如果在其他地方中導(dǎo)入該包,則為:
import (
...
"github.com/eddycjy/my-project/internals"
)
以上就是模塊和包的基礎(chǔ)前置知識。我們接下來正式進入提案的正題。
針對 Go 程序的代碼組織結(jié)構(gòu)管理,最近社區(qū)有個同學(xué)提出了一個新提案:
圖片
在 Go 里文件夾默認與包(Package)的關(guān)系是劃等號的。雖然這很方便,但是提案作者反饋:在某些情況下,我們需要通過文件夾來實現(xiàn)純粹的組織和可讀性目的,而不想引入新的包。
為此提出了 “透明文件夾” 的概念,通過使用諸如 Next.js 應(yīng)用程序路由器中看到的 (folder) 或 _folder 之類的語義來表示。
這些文件夾可以在不創(chuàng)建新軟件包的情況下組織軟件包內(nèi)的文件。它們將與軟件包的根目錄保持關(guān)系。
例子如下:
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,統(tǒng)一用 myapp 和 db 的包名就能進行引用。
簡單來講,該提案的實現(xiàn)方式是:通過將工程中 package name 和實體文件夾目錄的作用分割開,目的是:提供一種純粹的代碼組織方式。
其實類似的場景訴求,我有一個朋友曾經(jīng)聽幾個同事吐槽過。但一般會是在比較大的 Go 項目中,例如出現(xiàn)以下場景:
myapp
service
a-service
b-service
c-service
...
會認為這樣 package 切割的比較碎,但是不區(qū)分開。多了后在代碼結(jié)構(gòu)上又很容易繁雜化。所以會想有一種純碎的代碼組織方式。
爭議也是有不少的。因為他對語言的 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。也能達到類似的效果。
也有表示添加透明子文件夾會讓一切變得更加復(fù)雜,卻沒有任何好處。把文件放在它們應(yīng)該在的地方就可以了?,F(xiàn)在已經(jīng)在其他語言中看到過這種替代方法,很糟糕。
這個提案本身的出發(fā)點很常見,因為 package name 和代碼目錄結(jié)構(gòu)綁定了,會導(dǎo)致在設(shè)計代碼結(jié)構(gòu)時會有些受限,最終受此引導(dǎo)拆 package 來形成結(jié)構(gòu)化。
如果盲目的添加透明文件夾,反而會出現(xiàn)一個尷尬的問題。因為 Go 語言在這塊是非常直接的,添加了這類模式,大家反而會沒法篤定,要去看看項目的代碼結(jié)構(gòu)才能確定。
我認為反而會導(dǎo)致可讀性會有所下降。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流