溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go包內(nèi)的組成是怎樣的

發(fā)布時(shí)間:2022-01-17 14:19:07 來(lái)源:億速云 閱讀:110 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Go包內(nèi)的組成是怎樣的”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

包及其依賴

在開發(fā)微服務(wù)時(shí),按組件拆分服務(wù)很有用。每個(gè)組件都應(yīng)該是獨(dú)立的,理論上,如果需要,可以將其提取到外部服務(wù)。如何理解和實(shí)現(xiàn)呢?

假設(shè)我們有一個(gè)服務(wù),它處理與訂單相關(guān)的所有事情,比如發(fā)送電子郵件的確認(rèn)、將信息保存到數(shù)據(jù)庫(kù)、連接到支付提供商等。每個(gè)包都應(yīng)該有一個(gè)名稱,該名稱清楚地說(shuō)明了它的用途,并且遵守命名標(biāo)準(zhǔn)。

Go包內(nèi)的組成是怎樣的

這只是我們有 3 個(gè)包的項(xiàng)目的一個(gè)例子:confemails,payproviderswarehouse。包名應(yīng)盡量簡(jiǎn)短并能讓人一目了然。

每個(gè)包都有自己的 Setup()函數(shù)。該函數(shù)只接收能讓該包運(yùn)行的最基本的參數(shù)。例如,如果包對(duì)外提供 HTTP 服務(wù),那么 Setup() 函數(shù)則僅需要接受一個(gè)類似 mux route 的 HTTP route。當(dāng)包需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),Setup() 函數(shù)也是只接受 sql.DB 參數(shù)就可以了。當(dāng)然,這個(gè)包也可能需要依賴另一個(gè)包。

 

包內(nèi)的組成

知道了模塊的外部依賴,下一步我們就可以專注于如何在模塊內(nèi)組織代碼(包括相關(guān)依賴的處理)。在最開始,這個(gè)包包含以下文件: setup.go - 其中包含 Setup()函數(shù), service.go - 它是邏輯文件, repository.go - 它是在讀取/保存數(shù)據(jù)到數(shù)據(jù)的的文件。

Setup()函數(shù)負(fù)責(zé)構(gòu)建模塊的每個(gè)構(gòu)建塊,即服務(wù)、存儲(chǔ)庫(kù)、注冊(cè)事件處理程序或 HTTP 處理程序等等。這是使用這種方法的實(shí)際生產(chǎn)代碼的一個(gè)例子。

func Setup(router *mux.Router, httpClient httpGetter, auth jwtmiddleware.Authorization, logger logger) {
 h := httpHandler{
  logger:        logger,
  requestClaims: jwtutil.NewHTTPRequestClaims(client),
  service:       service{client: httpClient},
 }
 auth.CreateRoute("/v1/lastAnswerTime", h.proxyRequest, http.MethodGet)
}
 

以上代碼中,它構(gòu)建了 JWT 中間件,這是一個(gè)處理所有業(yè)務(wù)邏輯(以及日志的位置)并注冊(cè) HTTP 處理程序的服務(wù)。正因?yàn)槿绱耍K是非常獨(dú)立的,并且(理論上)可以轉(zhuǎn)移到單獨(dú)的微服務(wù)中,而不需要做太多工作。最后,所有的包都在 main 函數(shù)中配置。

有時(shí),我們需要一些處理程序或數(shù)據(jù)庫(kù)驅(qū)動(dòng)。例如,一些信息可以被存儲(chǔ)在數(shù)據(jù)庫(kù)中,然后通過(guò)事件發(fā)送到平臺(tái)的不同部分。使用像 saveToDb()這樣的方法將數(shù)據(jù)只保存在同一個(gè)庫(kù)中是很不方便的。所有類似的元素都應(yīng)該由以下功能分割:repository_order.go 或 service_user.go。如果對(duì)象的類型超過(guò) 3 種,則將其移動(dòng)到單獨(dú)的子文件夾中。

Go包內(nèi)的組成是怎樣的

 

測(cè)試

說(shuō)到測(cè)試,我堅(jiān)持一些原則。首先,在 Setup()函數(shù)中使用接口。這些接口應(yīng)該盡可能小。在上面的例子中,有一個(gè) httpGetter 接口。接口中只有Get()函數(shù)。

type httpGetter interface {
 Get(url string) (resp *http.Response, err error)
}

謝天謝地,我只需要模擬一個(gè)方法。接口的定義需要盡可能地接近它的用途。

其次,嘗試編寫更少的測(cè)試用例的同時(shí)可以覆蓋到更多的代碼。對(duì)于每個(gè)主函數(shù)的決策/操作,一個(gè)成功的測(cè)試用例和一個(gè)失敗的測(cè)試用例應(yīng)該足夠覆蓋大約 80% 的代碼。有時(shí),程序中有一些關(guān)鍵部分,這部分可以被單獨(dú)的測(cè)試用例覆蓋。

最后,在以 _test 為后綴的單獨(dú)包中編寫測(cè)試,并將其放入模塊中。把所有的東西都放在一個(gè)地方是很有用的。

當(dāng)您想要測(cè)試整個(gè)應(yīng)用程序時(shí),請(qǐng)?jiān)谥骱瘮?shù)旁邊的setup()函數(shù)中準(zhǔn)備好每個(gè)依賴項(xiàng)。它將為生產(chǎn)環(huán)境和測(cè)試環(huán)境提供相同的設(shè)置,可以為您避免一些 bug。測(cè)試應(yīng)該重用 setup()函數(shù),并且只模擬那些不易模擬的依賴項(xiàng)(比如外部 api)。

“Go包內(nèi)的組成是怎樣的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI