Go-項目結構和代碼組織

簡介

做大量的輸入,通過對比、借鑒,加上自己的經驗,產出一個盡可能優的方案。

開源界優秀項目的結構示例

因為最新的 Go 版本已經使用 module 作為版本依賴,所以,所有項目的 vendor 我都忽略,建議直接使用 module 來管理依賴,而且較好的解決某些庫國內訪問不了的問題,參考:https://studygolang.com/topics/8737

Docker

https://github.com/moby/moby

├── api      // 存放對外公開的 API 規則
├── builder  // 存放構建腳本等
├── cli      // 命令行的主要邏輯 
├── cmd      // 存放可執行程序,main 包放這個目錄中
├── contrib  // 存放一些有用的腳本或文件,但不是項目的核心部分
├── docs    // 存放文檔
├── internal // 只在本項目使用的包(私有)
├── pkg     // 本項目以及其他項目可以使用的包(公有)
├── plugin  // 提供插件功能

Kubernetes

https://github.com/kubernetes/kubernetes

├── api
├── build  // 存放構建腳本等
├── cmd
├── docs
├── pkg
├── plugin
├── test    // 單元測試之外的測試程序、測試數據
├── third_party // 經過修改的第三方的代碼

Gogs

https://github.com/gogs/gogs

├── cmd
├── conf    // 對配置進行解析
├── docker  // 存放 docker 腳本
├── models  // MVC 中的 model
├── pkg
├── public  // 靜態公共資源,實際項目會將其存入 CDN
├── routes  // 路由
├── scripts // 腳本文件
├── templates // 存放模板文件
``### influxdb
https://github.com/influxdata/influxdb

├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等,相當于 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts
```

開源項目小結

總體上,這些優秀開源項目,沒有統一一致的目錄結構方式,但大體上,有一些通用的地方,這就有了** https://github.com/golang-standards/project-layout **這個項目。

標準 Go 項目布局(結構)

https://github.com/golang-standards/project-layout 項目總結了 Go 項目的布局,我們一起看看這些主要的目錄。

/cmd

該目錄用于存放 Go 項目的入口,即 main.main。一般來說,我們應該在 cmd 目錄下創建子目錄,子目錄名稱代表可執行程序的名稱。上面列出的優秀開源項目基本上遵循了這一規則。
事實上,Go 語言本身,以及 github.com/golang/tools 都采用了 cmd 及其子目錄的形式,所以咱們的項目沒有理由不使用。
一般來說,該目錄中的代碼應該盡可能少。

/internal

這是 Go 包的一個特性,放在該包中的代碼,表明只希望項目內部使用,是項目或庫私有的,其他項目或庫不能使用。

/pkg

該包可以和 internal 對應,是公開的。一般來說,放在該包的代碼應該和具體業務無關,方便本項目和其他項目重用。當你決定將代碼放入該包時,你應該對其負責,因為別人很可能使用它。
因為 GOPATH 中有一個目錄就是 pkg,所以,社區有些人對該目錄不太能接受。但不管怎么樣,開源界有很多優秀項目在使用它,這里有一些使用它的項目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md

/api

該目錄用來存放 OpenAPI/Swagger 規則說明, JSON 格式定義, 協議定義文件等。也有可能用來存放具體的對外公開 API,比如 Docker:https://github.com/moby/moby/tree/master/api/server 。

/init

存放隨著系統自動啟動腳本,如:systemd, upstart, sysv;或者通過 supervisor 進行進程管理的腳本。

/scripts

存放 build、install、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔。

/build

該目錄用于存放打包和持續集成相關腳本。

/test

一般用來存放除單元測試、基準測試之外的測試,比如集成測試、測試數據等。

Go 語言源碼倉庫中就有 test 目錄。

/docs

存放設計和用戶文檔

/tools

存放項目的支持工具。

/third_party

從第三代碼包抽取過來的。根據官方建議,包名不應該有 _,所以本人不建議使用。真有這樣的需要,考慮命名為 thirdparty。

轉載于:https://www.cnblogs.com/Paul-watermelon/p/11230197.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iref streams_如何利用Neo4j Streams并建立即時數據倉庫

iref streamsby Andrea Santurbano通過安德里亞桑圖爾巴諾(Andrea Santurbano) 如何利用Neo4j Streams并建立即時數據倉庫 (How to leverage Neo4j Streams and build a just-in-time data warehouse) In this article, we’ll show how to create a Just-In-Time Data Wareho…

Nodejs正則表達式函數之match、test、exec、search、split、replace使用詳解

1. Match函數使用指定的正則表達式函數對字符串驚醒查找,并以數組形式返回符合要求的字符串原型:stringObj.match(regExp)參數:stringObj 必選項,需要去進行匹配的字符串RegExp 必選項,指定的正則表達式返回值&#xf…

Zabbix 3.0 從入門到精通(zabbix使用詳解)

第1章 zabbix監控 1.1 為什么要監控 在需要的時刻,提前提醒我們服務器出問題了 當出問題之后,可以找到問題的根源 網站/服務器 的可用性 1.1.1 網站可用性 在軟件系統的高可靠性(也稱為可用性,英文描述為HA,High Avail…

python 裝飾器裝飾類_5分鐘的Python裝飾器指南

python 裝飾器裝飾類重點 (Top highlight)There’s no doubt that Python decorators are one of the more advanced and tougher-to-understand programming concepts. This doesn’t mean you should avoid learning them — as you encounter them in production code soone…

php中顏色的索引值,計算PHP中兩種顏色之間的平均顏色,使用索引號作為參考值...

我們假設為了討論的目的,每個顏色都有一個“值”.那么,你想要的就足夠簡單:$index 0.2;$val1 get_value_of_color($color1);$val2 get_value_of_color($color2);$newval $val1 * $index $val2 * (1 - $index);$newcolor get_color_from_value($newval);所以,很…

leetcode 989. 數組形式的整數加法

對于非負整數 X 而言,X 的數組形式是每位數字按從左到右的順序形成的數組。例如,如果 X 1231,那么其數組形式為 [1,2,3,1]。 給定非負整數 X 的數組形式 A,返回整數 XK 的數組形式。 示例 1: 輸入:A […

您需要了解的WordPress漏洞以及如何修復它們

by Joel S. Syder喬爾賽德(Joel S.Syder) 您需要了解的WordPress漏洞以及如何修復它們 (WordPress vulnerabilities you need to know about — and how to fix them) WordPress is an incredibly useful and versatile platform for all kinds of blogging. It’s become ver…

Maven基礎。

---恢復內容開始--- Maven: 1、概念。 * maven 是一個項目管理工具。 * maven的作用。 1、jar包。依賴管理。將jar包放在jar包倉庫(pom.xml),不需要每個項目都添加jar包。 2、測試。 3、項目發布。 2、使用。 * 下載解壓即可。 * 環境變量配置…

Dinosaur Run - Dinosaur world Games

轉載于:https://www.cnblogs.com/hotmanapp/p/7092669.html

機器學習實際應用_機器學習的實際好處是什么?

機器學習實際應用Some of my previous introductory posts to machine learning and data science were a bit technical. However, my purpose of this post is to explain some of the practical use-cases of ML solely from a non-technical savvy layman’s perspective w…

Javascript的setTimeOut()和setInterval()的定時器用法

Javascript用來處理延時和定時任務的setTimeOut和setInterval函數應用非常廣泛,它們都用來處理延時和定時任務,比如打開網頁一段時間后彈出一個登錄框,頁面每隔一段時間發送異步請求獲取最新數據等等。但它們的應用是有區別的。 setTimeout()…

php隨機生成車牌號,生成汽車牌照

用戶隨機50選1。好的車牌用戶選不到。我目前的做法是這樣的。所有車牌入庫。別人選了狀態就修改為1。下面是入庫程序,想跟大家討論一下,有沒有更好的方式。use Illuminate\Database\Seeder;class LicensePlatesTableSeeder extends Seeder{public functi…

Go_ go mod 命令解決墻的問題

簡介 由于眾所周知的原因,在下載一些庫的時候會下載不了,比如 golang.org/x/... 相關的庫。為此,網上出現了很多解決方案。 從 Go1.11 開始,Go 引入了 module,對包進行管理,通過 go mod 命令來進行相關操作…

leetcode 1319. 連通網絡的操作次數(并查集)

用以太網線纜將 n 臺計算機連接成一個網絡,計算機的編號從 0 到 n-1。線纜用 connections 表示,其中 connections[i] [a, b] 連接了計算機 a 和 b。 網絡中的任何一臺計算機都可以通過網絡直接或者間接訪問同一個網絡中其他任意一臺計算機。 給你這個…

MySQL中choose標簽的用法

先給大家來個SQL語句&#xff1a; choose (when,otherwize) ,相當于java 語言中的 switch ,與 jstl 中 的 choose 很類似。 <select id"getMemberInfo" resultType"java.util.Map" parameterType"java.util.Map" > SELECT …

php hsetnx,HSETNX命令_視頻講解_用法示例-redis編程詞典-php中文網

set英 [set] 美 [s?t]vt.設置;放置&#xff0c;安置;使處于某種狀況;擺放餐具vi.落山;出發;凝結n.集合;一套&#xff0c;一副;布景;電視機adj.固定的;位于…的;頑固的;安排好的第三人稱單數&#xff1a; sets 復數&#xff1a; sets 現在分詞&#xff1a; setting 過去式&am…

用導函數的圖像判斷原函數的單調性

前言 典例剖析 例1(給定\(f(x)\)的圖像&#xff0c;確定\(f(x)\)的單調性&#xff0c;最簡單層次) 題目暫略。 例2(用圖像確定\(f(x)\)的正負&#xff0c;確定\(f(x)\)的單調性&#xff0c;2017聊城模擬) 已知函數\(yxf(x)\)的圖像如圖所示(其中\(f(x)\)是函數\(f(x)\)的導函數…

樸素貝葉斯 半樸素貝葉斯_使用樸素貝葉斯和N-Gram的Twitter情緒分析

樸素貝葉斯 半樸素貝葉斯In this article, we’ll show you how to classify a tweet into either positive or negative, using two famous machine learning algorithms: Naive Bayes and N-Gram.在本文中&#xff0c;我們將向您展示如何使用兩種著名的機器學習算法&#xff…

python3:面向對象(多態和繼承、方法重載及模塊)

1、多態 同一個方法在不同的類中最終呈現出不同的效果&#xff0c;即為多態。 class Triangle:def __init__(self,width,height):self.width widthself.height heightdef getArea(self):areaself.width* self.height / 2return areaclass Square:def __init__(self,size):sel…

蠕變斷裂 ansys_如何避免范圍蠕變,以及其他軟件設計課程的辛苦學習方法

蠕變斷裂 ansysby Dror Berel由Dror Berel 如何避免范圍蠕變&#xff0c;以及其他軟件設計課程的辛苦學習方法 (How to avoid scope creep, and other software design lessons learned the hard way) 從數據科學的角度來看。 (From a data-science perspective.) You’ve got…