最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解Go項(xiàng)目標(biāo)準(zhǔn)目錄布局

 更新時(shí)間:2022年05月07日 10:00:02   作者:程序員讀書  
本文主要介紹了Go項(xiàng)目標(biāo)準(zhǔn)目錄布局,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

很多的時(shí)候,我們開發(fā)一個(gè)簡單的Go項(xiàng)目的時(shí)候并不需要糾結(jié)于項(xiàng)目的的目錄布局,因?yàn)槲覀儠?huì)將所有g(shù)o源碼文件扔在項(xiàng)目的根目錄中,就像下面這樣:

demo
├── main.go
├── model.go
└── service.go

但當(dāng)我們的項(xiàng)目變得復(fù)雜的時(shí)候,我們就需要好好思考怎么組織我們的項(xiàng)目了,這時(shí)候你可能會(huì)想,用官方的Go項(xiàng)目目錄布局就好了,然而Go的官方并沒有給出一個(gè)標(biāo)準(zhǔn)的Go項(xiàng)目標(biāo)準(zhǔn)目錄布局。

目前,Go社區(qū)開發(fā)者比較推薦的是project-layout項(xiàng)目中給出的目錄布局,如:

demo
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website

然而官方并不推薦這種項(xiàng)目布局方式,下面是Go團(tuán)隊(duì)開發(fā)leader Russ Cox對(duì)project-layout目錄的意見:

大體上,我們可以將Go的項(xiàng)目分為兩類,應(yīng)用項(xiàng)目與庫項(xiàng)目。

  • 應(yīng)用項(xiàng)目:即包含可執(zhí)行文件的項(xiàng)目,項(xiàng)目開發(fā)后,需要編譯成可執(zhí)行文件并上線運(yùn)行。

  • 庫項(xiàng)目:庫文件一般用于暴露Api,被其他項(xiàng)目通過import關(guān)鍵字引入。

應(yīng)用項(xiàng)目與庫項(xiàng)目的目錄布局方式稍有差異。

應(yīng)用項(xiàng)目

對(duì)于應(yīng)用項(xiàng)目,其目錄布局方式我們可以參考Go項(xiàng)目自身,以及一些使用Go語言開發(fā)的優(yōu)秀開源項(xiàng)目(如Docker,Kubernetes,etcd)等,通過研究這些項(xiàng)目的目錄布局,我們可以抽象出以下標(biāo)準(zhǔn)目錄:

demo
├── cmd
│   ├── app1
│   │   └── main.go
│   └── app2
│       └── main.go
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
├── pkg2
│   └── pkg2.go
└── vendor

cmd

可執(zhí)行文件目錄,如果一個(gè)項(xiàng)目有多個(gè)可執(zhí)行文件,可以放在不同的子目錄中,如上面例子中的app1和app2目錄。

internal

項(xiàng)目內(nèi)部私有代碼,其他項(xiàng)目引入時(shí)會(huì)報(bào)錯(cuò)。

pkgN:

注意,這里并不是說一定要pkg為前綴來命名,你可以對(duì)取任意符合包命名規(guī)范的名稱,比如service,model等

即上面示例中的pkg1與pkg2,pkgN包與internal包一樣存放項(xiàng)目的依賴代碼,但存儲(chǔ)在這里的代碼,可以被其項(xiàng)目引入。

vendor

這個(gè)目錄用于存儲(chǔ)項(xiàng)目的依賴包,但由于現(xiàn)今Go項(xiàng)目都是使用go module進(jìn)行依賴管理,因此這個(gè)目錄是可省略的。

如果我們的項(xiàng)目只有一個(gè)可執(zhí)行文件,可以將main.go文件直接寫在根目錄,而vendor可以省略,因此,項(xiàng)目目錄可以進(jìn)一步精簡為:

demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── main.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

庫項(xiàng)目

庫項(xiàng)目不需要可執(zhí)行文件,相比于應(yīng)用項(xiàng)目,省略了cmd目錄,其標(biāo)準(zhǔn)目錄下:

demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

如果我們的庫項(xiàng)目比較簡單,可以采用平鋪式項(xiàng)目布局,即將所有的功能寫在一個(gè)包里,所有源碼目錄放在根目錄下,如:

demo
├── feature1.go
├── feature2.go
├── feature3.go
├── go.mod
└── go.sum

平鋪式的項(xiàng)目布局非常適合簡單的庫項(xiàng)目,事實(shí)上,很多復(fù)雜的庫項(xiàng)目也會(huì)將大量的代碼放在根目錄下,因?yàn)檫@樣,其他項(xiàng)目使用import引入項(xiàng)目的包時(shí),路徑會(huì)比較短,比如我們有一個(gè)結(jié)構(gòu)體A,放在pkg1包下與放在根目錄下,其引路徑分別是:

import "demo"

import "demo/pkg1"

小結(jié)

好了,閱讀到這里,想必你已經(jīng)了解了Go應(yīng)用項(xiàng)目與庫項(xiàng)目目錄布局的不同了吧。

不過,由于Go官方項(xiàng)目指定的項(xiàng)目布局,因此上述的幾種項(xiàng)目目錄都是社區(qū)開發(fā)的約定俗成,并不具備強(qiáng)制性,你也可以定制自己的Go項(xiàng)目目錄布局,不過我想,使用社區(qū)開發(fā)都遵循的目錄規(guī)范,還是有助于降低團(tuán)隊(duì)開發(fā)人員的認(rèn)知與交流成本的。

到此這篇關(guān)于深入了解Go項(xiàng)目標(biāo)準(zhǔn)目錄布局的文章就介紹到這了,更多相關(guān)Go標(biāo)準(zhǔn)目錄布局內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語言net包rpc遠(yuǎn)程調(diào)用的使用示例

    go語言net包rpc遠(yuǎn)程調(diào)用的使用示例

    本篇文章主要介紹了go語言net包rpc遠(yuǎn)程調(diào)用的使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 詳解Go語言如何利用高階函數(shù)寫出優(yōu)雅的代碼

    詳解Go語言如何利用高階函數(shù)寫出優(yōu)雅的代碼

    高階函數(shù)(Hiher-order?Function)定義為:滿足下列條件之一的函數(shù):接收一個(gè)或多個(gè)函數(shù)作為參數(shù);返回值是一個(gè)函數(shù)。本文為大家介紹了如何利用高階函數(shù)寫出優(yōu)雅的代碼,希望對(duì)大家有所幫助
    2023-01-01
  • go語言實(shí)現(xiàn)同步操作項(xiàng)目示例

    go語言實(shí)現(xiàn)同步操作項(xiàng)目示例

    本文主要介紹了go語言實(shí)現(xiàn)同步操作項(xiàng)目示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Go語言命令行參數(shù)及cobra使用方法

    Go語言命令行參數(shù)及cobra使用方法

    Cobra是關(guān)于golang的一個(gè)命令行解析庫,用它能夠快速創(chuàng)建功能強(qiáng)大的 cli應(yīng)用程序和命令行工具,本文主要介紹了Go語言命令行參數(shù)及cobra使用方法,感興趣的可以了解一下
    2024-01-01
  • Go語言使用時(shí)會(huì)遇到的錯(cuò)誤及解決方法詳解

    Go語言使用時(shí)會(huì)遇到的錯(cuò)誤及解決方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言使用時(shí)常常會(huì)遇到的一些錯(cuò)誤及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • 詳解如何利用GORM實(shí)現(xiàn)MySQL事務(wù)

    詳解如何利用GORM實(shí)現(xiàn)MySQL事務(wù)

    為了確保數(shù)據(jù)一致性,在項(xiàng)目中會(huì)經(jīng)常用到事務(wù)處理,對(duì)于MySQL事務(wù)相信大家應(yīng)該都不陌生。這篇文章主要總結(jié)一下在Go語言中Gorm是如何實(shí)現(xiàn)事務(wù)的;感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助
    2022-09-09
  • Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    說實(shí)話,golang的時(shí)間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關(guān)于golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Go 語言中的死鎖問題解決

    Go 語言中的死鎖問題解決

    本文主要介紹了Go 語言中的死鎖問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 詳解Golang中哪些類型可以作為map的key

    詳解Golang中哪些類型可以作為map的key

    在 Go 語言中,map 是一種內(nèi)置的關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)類型,由一組無序的鍵值對(duì)組成,每個(gè)鍵都是唯一的,并與一個(gè)對(duì)應(yīng)的值相關(guān)聯(lián),本文將詳細(xì)介紹哪些類型的變量可以作為 map 的鍵,并通過實(shí)例進(jìn)行說明,感興趣的朋友可以參考下
    2024-01-01
  • golang中sync.Once只執(zhí)行一次的原理解析

    golang中sync.Once只執(zhí)行一次的原理解析

    在某些場景下,我們希望某個(gè)操作或者函數(shù)僅被執(zhí)行一次,比如單例模式的初始化,一些資源配置的加載等,golang中的sync.Once就實(shí)現(xiàn)了這個(gè)功能,本文就和大家一起解析sync.Once只執(zhí)行一次的原理,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

陆河县| 黄龙县| 界首市| 南通市| 南召县| 台东市| 石首市| 辽中县| 本溪市| 满城县| 无为县| 阳信县| 灌云县| 邮箱| 延安市| 华蓥市| 修文县| 招远市| 射阳县| 阿城市| 淅川县| 遵化市| 邯郸市| 黄冈市| 五莲县| 衢州市| 九台市| 兴仁县| 葫芦岛市| 达日县| 中江县| 延津县| 岳西县| 卓资县| 开平市| 木兰县| 佛山市| 呈贡县| 元江| 岳西县| 江津市|