我一直在尋找到golang爲了建立一個網絡應用程序,我喜歡語言和一切,但我遇到了麻煩,圍繞着golang結構的概念。看起來這幾乎迫使我沒有文件結構,沒有文件夾,沒有劃分,也沒有分離關注點。有沒有辦法以我沒有看到的方式組織.go文件?到目前爲止,文件構造一直令人頭疼,這是我對這門語言唯一不好的體驗。謝謝!golang foment沒有文件結構嗎?
回答
你是部分權利。 Go不強制執行關於文件和包結構的任何內容,只是它禁止循環依賴。恕我直言,這是一件好事,因爲你有自由選擇你最好的套房。
但是,它決定什麼是最好的負擔。我嘗試了幾種方法,並根據我在做什麼(例如庫,命令行工具,服務),我認爲不同的方法是最好的。
如果您只創建命令行工具,請讓根包(您的存儲庫的根目錄)爲main
。如果它是小工具,那就是你所需要的。可能會發生命令行工具不斷增長的情況,因此您可能需要將某些內容分離到自己的內容中,但可能並非必須位於同一個存儲庫中。
如果您正在創建庫,請執行相同的操作,但包名稱不是您的庫的名稱,而是main
。
如果您需要組合(作爲庫和命令行工具都有用),我會將庫代碼(庫中的所有內容)放入VCS根目錄,並附帶潛在的子包和cmd/toolname
二進制文件。
當談到網絡服務時,我發現遵循these準則是最實際的。最好閱讀整篇博客文章,但總之 - 在VCS根目錄下定義您的域,創建cmd/app
(或多個)作爲命令行入口點併爲每個依賴項(例如memcache,數據庫,http等)創建一個包。你的子包永遠不會明確地相互依賴,它們只從根共享域定義。這需要一些習慣,我仍然在適應我的用例,但到目前爲止它看起來很有希望。
這就是一個有趣的方式,我正在採取另一種方法,讓我的處理程序在一個獨立的包中共享結構和數據庫服務,並將其導入我的主要 – Amirgem
正如@德爾男孩說,這取決於你想要做什麼,我多次去了這個問題,但什麼適合我更多的時候開發golang web應用程序是依賴於將你的包
- myproject
-- cmd
--- main.go
-- http
--- http.go
-- postgres
--- postgres.go
-- mongodb
--- mongodb.go
myproject.go
myproject.go將包含接口和的Structs包含的主要領域或業務模式
例如,你可以有內部myproje ct.go
type User struct {
MongoID bson.ObjectId `bson:"_id,omitempty"`
PostgresID string
Username string
}
像這樣
type UserService interface {
GetUser(username string) (*User, error)
}
在
HTTP包
現在,您將處理暴露你的API端點
//Handler represents an HTTP API interface for our app.
type Handler struct {
Router *chi.Mux // you can use whatever router you like
UserService myproject.UserService
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *Request){
//this just a wrapper for the Router ServeHTTP
h.Router.ServeHTTP(w,r)
}
func (h *Handler) someHandler(w http.ResponseWriter, r *Request){
//get the username from the request
//
user := h.UserService.GetUser(username)
}
在你的Postgres的接口。去了你就可以有一個結構實現UserService
type PostgresUserService struct {
DB *sql.DB
}
,然後你實現服務
func (s *PostgresUserService) GetUser(username string) {
//implement the method
}
,同樣的事情可以用MongoDB中完成
type MongoUserService struct {
Session *mgo.Session
}
func (s *MongoUserService) GetUser(username string) {
//implement the method
}
現在在你的CMD/main.go你可以有這樣的事情
func main(){
postgresDB, err := postgres.Connect()
mongoSession, err := mongo.Connect()
postgresService := postgres.PostgresUserService{DB: postgresDB}
mongoService := mongo.MongoUserService{Session: mongoSession}
//then pass your services to your http handler
// based on the underlying service your api will act based on the underlying service you passed
myHandler := http.Handler{}
myHandler.UserService = postgresService
}
假設你改變底層存儲你只需要改變它在這裏,你會不會改變任何東西
這樣的設計在很大程度上從這個blog啓發,我希望你覺得它有用
- 1. Golang net.ListenTCP結構
- 2. Golang - 結構
- 3. Golang嵌入結構
- 4. Golang結構比較
- 5. Golang混淆結構
- 6. golang一個結構
- 7. Golang接口結構
- 8. Golang代碼結構
- 9. Golang和JSON結構
- 10. golang重用結構
- 11. 泛化結構 - golang
- 12. 與結構與golang
- 13. Golang - 嵌套結構
- 14. 結構化文件沒有db
- 15. TFS 2017構建複製文件沒有文件夾結構?
- 16. 的Xcode組結構中沒有在文件結構
- 17. Golang gads包沒有文件認證
- 18. 獲取只有沒有文件的回購文件夾結構
- 19. 有關結構的golang語法問題
- 20. 使盡可能少的改動JSON數據沒有結構golang
- 21. 迭代通過結構在golang沒有反映
- 22. Golang - 結構與接口JSON
- 23. Golang:在結構錯誤
- 24. Beego/Golang - 查詢結構值
- 25. 嵌套地圖結構golang
- 26. golang結構數組轉換
- 27. Golang結構初始化
- 28. golang:使用嵌套結構
- 29. 從XSD創建Golang結構
- 30. Golang結構會從輸入
沒有你看看:https://golang.org/doc/code.html? –
是的,我做了,從我收集如果我會使用MVC模式,我將不得不創建一個控制器和模型的包是正確的?但arent軟件包應該用於多個系統? – Amirgem
https://github.com/gernest/utron可能是一個很好的例子 –