国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 項目布局的實戰經驗:別再濫用 pkg 和 util 了

開發 前端
我們要回歸 Go 的哲學:簡單優先,先能跑,再優雅。多數團隊在項目初期做的過度工程(把 internal/、pkg/、cmd/ 都直接套上)更多是為了 “看起來成熟”,但長期結果往往是維護負擔增加。

最近微信群里有小伙伴再次提出了靈魂疑問:

Go 項目應該怎么組織目錄結構?

這是個反復出現的問題。網上確實有一些過度復雜的博客和示例倉庫,把很多同學都整糊涂了。

今天我們來梳理一下常見的“坑”,以及更實用的項目組織方式。

畢竟 Go 這一門編程語言的核心哲學是:less is more,少點花里胡哨的層次。

核心原則(一句話版)

  • 先把可用的東西做出來,再考慮拆包。
  • 不要為了 “某種慣例” 或 “看起來專業” 而過度設計。
  • internal/、pkg/、cmd/ 這些都是工具,并不是每個項目都必須要用的。

要點與示例

1. main 放哪里?

建議:主程序(CLI / server)放在倉庫根目錄的 main(或直接 main.go)是最簡單也最常用的。

優勢之一是安裝/運行最短路徑。

便于 go install:

# 最短最干凈的安裝方式(root 有 main)
go install github.com/eddycjy/project@latest

只有庫(library)的倉庫自然沒有 main。如果既有庫又有二進制,可以把 main 放子目錄(很多人習慣 cmd/yourcmd/,但 cmd 本身并非必須)。

示例(根目錄有 main):

/project
  go.mod
  main.go      // 程序入口
  lib/         // 如果你還有對外庫
  internal/    // 可選
  README.md

或者把可復用代碼放到一個清晰命名的包,而不是把 main 挪得過遠。

2. internal/ 是特性不是儀式

internal/ 的機制是 Go 工具鏈強制的:internal 下的代碼只能被父目錄(和子級樹)里的包導入。

好處是可以阻止外部依賴,但不是每個項目都需要它。

這時候就涉及到什么時候用?

當你真的有很多對外不暴露但跨包復用的代碼,并且項目會被大量第三方使用時才考慮 internal/。

對絕大多數小中型項目來說,不用 internal/ 更簡單、更靈活。

示例(使用場景):

/project
  internal/
    secrets/   // 只有 project 內部可以 import
  pkg/         // 對外可用庫(慎用 pkg_/)
  main.go

3. 別盲目使用 pkg/

pkg/ 是歷史遺留的慣例,在現代 Go 里沒必要把所有對外包都塞進 pkg/。

包名與路徑應以可讀性與語義為核心。把包放到頂層(/auth、/db、/storage)通常更直觀,且導入路徑更短。

示例對比:

不推薦(多一層 pkg):

import "github.com/you/project/pkg/storage"

更推薦(語義清晰):

import "github.com/you/project/storage"

4. 不要亂建 util、common 等

“工具類” 包看起來方便,但會變成隨手塞東西的垃圾倉庫。把函數/類型放到語義化更強的包里,或放在最常用的使用位置鄰近代碼,而不是一個籠統的 util。

反面示例:

// util/strings.go
package util
func Reverse(s string) string { ... }

更好寫法(語義化):

// text/reverse.go
package text
func Reverse(s string) string { ... }

// 或者直接放在使用它的包里,例如 handler/text_helpers.go

5. 包不要太多(也別千行一包)

Go 可以在一個包里有多個文件,這一點要善用。每新增一個包,就可能增加依賴、回環風險和遷移成本。相反,也不要把完全不相關的代碼塞成一個冗長的包——保持“以用途/語義分包”。

經驗規則:

  • 如果一組代碼有同一語義與同一生命周期,放到同一個包。
  • 每個包最好能在 200–1000 行范圍內(這不是硬性規則,只是可讀性提醒)。
  • 切包優先按“用途”而不是“文件大小”。

6. 文件別太細碎

許多人喜歡把每個小函數放不同文件,結果翻代碼像翻書頁。合理把相關函數聚合到同一文件,便于閱讀。

避免把每個 tiny helper 分成獨立文件。

7. 語義化命名優先于目錄深度

庫名、包名與目錄名應體現用途。例如 applog 比 util/log 更有意義。

這樣看代碼的同學通過 import 一眼能看出大致的用途。

8. 版本管理和 semver 建議

建議盡量使用 0.x 階段語義化版本(保守上 v0.x),在你要打破 API 時給出明確變更說明,而不是過早把版本固定為 v2/v3,導致用戶為小改動分叉倉庫。

換句話說:先發布、后演進,記錄變更而不是封閉。

推薦的最小倉庫模板(實戰)

下面給出一個適合多數小中型項目的極簡布局,能覆蓋 CLI / library 混合場景:

/project
  go.mod
  main.go             // 如果是二進制,把入口放這里
  README.md
  config/              // 配置相關包
  storage/             // 存儲邏輯
  api/                 // HTTP handler / grpc / rpc
  tools/               // 非構建、非導出的腳本 & 工具(可忽略 go build)
  docs/

如果你確實需要多個可發布包,再考慮增加清晰命名的子包,而不是 pkg/ 通用層。

Go 官方建議,要關注細節

Go 官方確實給了一份指南:go.dev/doc/modules/layout[1]。

里面有句話經常被曲解:


Larger packages or commands may benefit from splitting… Initially, put them in internal/.

這里的重點其實是 larger 和 may。

結果很多人一上來就機械套用:不管項目大小,先建個 internal/;

現實是要知道目錄不是 “一步到位” 的事,需要階段性調整和設計。

總結

我們要回歸 Go 的哲學:簡單優先,先能跑,再優雅。多數團隊在項目初期做的過度工程(把 internal/、pkg/、cmd/ 都直接套上)更多是為了 “看起來成熟”,但長期結果往往是維護負擔增加。

把注意力放在清晰的包命名、合理的功能邊界、良好的 README 上,必要時再重構目錄結構和演進會比較好。

參考資料

[1] go.dev/doc/modules/layout: https://go.dev/doc/modules/layout

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-07-04 00:00:00

2025-05-30 08:09:28

2017-11-02 15:07:56

代碼重寫代碼開發

2011-07-07 10:49:41

JavaScript

2023-10-23 13:03:04

2013-01-25 10:37:51

敏捷開發

2020-04-28 14:50:30

短視頻運營實戰

2017-01-05 16:29:00

2021-05-19 20:20:56

Oracle歸檔修復

2025-07-09 07:15:00

AIGenAICIO

2010-07-06 16:22:14

2009-10-20 09:17:27

2015-11-10 09:40:55

IT實施計劃IT

2015-11-10 09:50:51

IT實施計劃IT

2010-02-23 16:17:59

2025-08-29 07:25:00

CIOAI企業

2025-09-28 07:00:00

IT人才招聘風險IT經理

2009-09-10 18:28:00

交換機和路由器連接

2017-08-21 08:20:03

海云捷迅教育云實戰

2025-06-27 09:00:00

勒索軟件網絡攻擊
點贊
收藏

51CTO技術棧公眾號

激情成人综合网| 国产精品一区在线| 欧美成在线视频| 在线观看黄色av| 国产精品久久久久7777按摩| 成人免费看片'免费看| 久久久精品性| 开心色怡人综合网站| 国内精品嫩模av私拍在线观看| 国产精品久久久久久久av大片| 四虎精品在线观看| 国产亚洲精品va在线观看| 免费毛片在线看片免费丝瓜视频| 色妞www精品视频| 色吊丝在线永久观看最新版本| 亚洲精品成人在线| 久草电影在线| 色综合欧美在线| 青青青手机在线视频观看| 午夜欧美2019年伦理| 又黄又爽的视频在线观看| 亚洲成人在线网站| 国产尤物视频在线| 91精品国产丝袜白色高跟鞋| av免费网站在线| 亚洲成色777777女色窝| 超碰在线视屏| 日韩视频免费在线观看| 这里视频有精品| 国产999精品久久久| 婷婷久久一区| 麻豆精品传媒视频| 国产精一区二区三区| 波多野结衣综合网| 亚洲国产成人一区二区三区| 免费毛片aaaaaa| 欧美视频裸体精品| 永久免费av在线| 日韩精品极品在线观看| 国产精品诱惑| 秋霞成人午夜鲁丝一区二区三区| 99久久夜色精品国产亚洲狼| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 少妇人妻大乳在线视频| 91免费国产在线| 国外av网站| 欧美日韩一区二区在线视频| 91九色美女在线视频| 在线一区二区日韩| 免费久久久久久久久| 国内精品二区| av在线播放一区二区三区| 全网国产福利在线播放| 欧美二区三区91| 伊人久久精品| 91在线网站视频| 国产激情91久久精品导航| 男女羞羞网站| 日韩欧美国产一区二区三区| 精品中文在线| 99久久99久久精品国产片| 国产一区二区三区精品视频| 日韩精品视频一二三| 欧美午夜电影一区| 国产精品视频一区二区三区综合 | 亚洲一区免费看| 中文字幕va一区二区三区| 深夜福利在线看| 国产一区二区久久精品| 日韩国产一区| 青青在线免费观看| 一本一道久久a久久精品综合蜜臀| 免费观看成人性生生活片| 成人黄色免费片| 99国产精品99久久久久久| 国产69精品久久app免费版| 日韩在线精品一区| 一区二区三区福利| 色综合色综合色综合色综合| 日韩精品中文字幕一区| 老牛精品亚洲成av人片| 精品久久免费观看| 婷婷成人综合网| 日本在线一区二区| 欧美男人的天堂| 午夜亚洲国产au精品一区二区| 欧美日韩亚洲国产| 国产精品免费一区二区三区四区| 国产欧美精品一区二区色综合朱莉 | 久久影视免费观看| 免费亚洲一区| 最新理论片影院| 欧美精品在线观看| 麻豆成人久久精品二区三区小说| 满满都是荷尔蒙韩剧在线观看| 中文字幕亚洲一区在线观看| 亚洲三级毛片| 在线免费福利| 4438全国亚洲精品在线观看视频| 欲色天天网综合久久| 国产成人亚洲综合a∨婷婷图片| 婷婷五月色综合香五月| 2019亚洲男人天堂| 国产黄色精品视频| 污片在线免费观看| 国产精品久久亚洲| 一区二区三区日韩欧美精品| 欧美天堂一区| 最新国产精品久久| 日韩亚洲欧美高清| 99国产成+人+综合+亚洲欧美| 日日噜噜噜夜夜爽爽狠狠视频| 日韩在线免费观看视频| 日韩高清不卡一区二区| 欧美区日韩区| 亚欧美无遮挡hd高清在线视频 | 日本视频在线免费观看| 欧美人妇做爰xxxⅹ性高电影| 亚洲观看高清完整版在线观看| 日韩精品一二三区| 深夜在线视频| v888av成人| 国产精品欧美亚洲777777| 亚洲一级一级97网| 亚洲人成伊人成综合网久久久| 国产麻豆精品久久一二三| 久久综合五月婷婷| 免费在线国产视频| caoporn超碰97| 久久99国产综合精品女同| 国内久久精品视频| 欧美最新另类人妖| 欧美xxx.com| aa日韩免费精品视频一| 亚洲国产精品一区二区www在线| 精品国产亚洲一区二区三区在线| 无码粉嫩虎白一线天在线观看| 日韩精品福利网站| 精品亚洲国产成人av制服丝袜| 日日夜夜一区| 亚洲午夜av| 国产精品99久久久久久久女警| 亚洲欧美日韩精品一区二区| 久久爱www久久做| 久久99精品久久久久久久久久久久| 欧美va天堂在线| 丝袜连裤袜欧美激情日韩| gogo在线观看| 激情伊人五月天| 97国产超碰| 国产999精品久久久影片官网| 欧美性生活大片视频| 久久色视频免费观看| 日本不卡一区二区三区高清视频| 在线中文字幕亚洲| 国产精品激情| 国产毛片一区| 一区二区毛片| 我不卡伦不卡影院| 精品久久亚洲| 午夜影院免费播放| 在线视频不卡国产| 国产日韩欧美一区二区| 性色av一区二区咪爱| 欧美一区二区三区视频免费| 99re66热这里只有精品3直播| 亚洲综合视频网| 欧美日韩中文字幕综合视频| 亚洲天天做日日做天天谢日日欢| 成人免费视频在线观看| 日本一区二区免费在线| 尤物av一区二区| 亚洲动漫第一页| 亚洲色欲色欲www在线观看| 疯狂蹂躏欧美一区二区精品| 国产高清视频一区| 日韩国产成人精品| av中文字幕一区二区| 不卡福利视频| 国际av在线| 91精品国产一区二区在线观看| 国产综合18久久久久久| 亚洲电影免费观看| 99精品一区二区三区| 欧美极品在线观看| av中文字幕电影在线看| 色婷婷狠狠18| 精品伦理一区二区三区| 日韩在线欧美在线国产在线| 亚洲激情综合网| 久久精品免费看| 视频一区在线观看| 1024在线看片你懂得| 国产字幕中文| 久久久久福利视频| 亚洲www在线| 高清亚洲成在人网站天堂| 日韩视频在线一区二区| 亚洲视频免费看| 国产精品一区一区三区|