在GO中構建GraphQl Server
用GO Mod Init初始化GO模塊,2。 SthernGQLGEN CLI,3。在schema.graphqls中定義一個架構,4。運行gqlgen init以生成型號和解析器,5。用於查詢和突變的分辨率函數,6。使用Generated Schema的HTTP服務器設置HTTP服務器,以及70.運行式訪問plays in。 GQLGEN在GO中提供了類型安全,架構優先和生產的GraphQl Server。
借助graphql-go
和gqlgen
等庫,在GO中構建GraphQl Server已變得越來越流行。儘管您都可以定義模式並解決查詢,但GQLGEN是更現代,類型和開發人員友好的選擇,尤其是對於生產應用程序。

這是使用GQLGEN在GO中設置基本的GraphQl Server的方法,並具有最小的樣板和最大的清晰度。
✅1。初始化您的GO模塊
首先創建一個新的項目目錄並初始化GO模塊:

mkdir graphql-go-server CD GraphQl-Go-Server Go Mod Init Github.com/yourusername/graphql-go-server
✅2。安裝GQLGEN
Go nistal install github.com/99designs/gqlgen@latest
確保gqlgen
CLI在您的PATH
上。
✅3。創建基本架構( schema.graphqls
)
在您的項目root中創建一個名為schema.graphqls
的文件:

類型todo { id:id! 標題:字符串! 完成:布爾人! 用戶:用戶! } 鍵入用戶{ id:id! 名稱:字符串! } 類型查詢{ Todos:[todo! ]! } 輸入newtodo { 標題:字符串! 用戶ID:字符串! } 類型突變{ createTodo(輸入:newtodo!):todo! }
這定義了:
- 兩種類型:
Todo
和User
- 查詢以獲取Todos
- 突變創建一個新的湯do
✅4。生成模型和解析器
運行GQLGEN生成初始代碼:
gqlgen Init
這將:
- 生成
generated.go
(自動生成的解析器) - 使用Stubs創建
graph/schema.resolvers.go
- 在
server.go
中設置基本服務器
現在,您可以在需要時自定義生成的模型。或讓GQLGEN通過編輯gqlgen.yml
從模式中生成它們:
型號: 托多: 字段: ID: 解析器:錯誤 標題: 解析器:錯誤 完畢: 解析器:錯誤 用戶: 解析器:是的#我們為此寫一個解析器
然後再生模型:
GQLGEN生成
✅5。實施解析器
編輯graph/resolver.go
和graph/schema.resolvers.go
。
示例:托多斯的解析器
在graph/schema.resolvers.go
中:
func(r *queryResolver)todos(ctx context.context)([] *model.todo,error){ 返回[]*model.todo { { id:“ 1”, 標題:“學習去”, 完成:false, 用戶:&model.user {id:“ 1”,name:“ alice”}, },, },零 }
突變:CreateTodo
func(r *mutationResolver)createTodo(ctx context.context,input model.newtodo)( *model.todo,error){ todo:=&model.todo { id:“ 2”,//在真實應用中,使用UUID或DB自動啟動 標題:input.title, 完成:false, 用戶:&model.user {id:input.userid,name:“ unknown”}, } 返回Todo,nil }
另外,請確保在graph/resolver.go
中註冊溶要結構。
✅6。設置HTTP服務器
gqlgen init
創建的server.go
。應該看起來像這樣:
包裝主 進口 ( "紀錄" “ net/http” “ github.com/yourusername/graphql-go-server/graph” “ github.com/99designs/gqlgen/graphql/handler” “ github.com/99designs/gqlgen/graphql/playground” ) func main(){ srv:= handler.newdefaultserver(graph.newexecutableschema(graph.config {resolvers:&graph.resolver {}}}))) http.handle(“/”,Playground.handler(“ GraphQl Playground”,“/QUERY”)) http.handle(“/query”,srv) log.printf(“連接到http:// localhost:8080/for GraphQl Playground”) log.Fatal(http.listenandserve(“:8080”,nil)) }
✅7。運行服務器
GO RUN SERVER.GO
打開瀏覽器http://localhost:8080
- 您會看到GraphQl Playground。
嘗試查詢:
詢問 { todos { ID 標題 完畢 用戶{ 姓名 } } }
或突變:
突變{ createtodo(輸入:{標題:“ buy Milk”,userId:“ 2”}){ ID 標題 完畢 用戶{ 姓名 } } }
?現實世界使用的提示
-
使用數據庫:通過
pg
,gorm
或ent
與PostgreSQL,MongoDB等集成。 -
添加上下文:使用
context.Context
進行身份驗證,記錄或跟踪。 -
錯誤處理:需要在需要時返回適當的
gqlerror.Errorf
。 - 驗證:創建記錄之前驗證輸入。
- 架構縫合或聯邦:對於較大的應用程序,請考慮模塊化服務。
?為什麼要gqlgen?
- 首先:首先寫您的API合同。
- 類型安全:GO結構是由模式生成的。
- 最小樣板:僅在需要的地方寫解析器。
- 積極維護:許多團隊用於生產。
基本上,使用gqlgen
,您將獲得一個清潔,可維護的GraphQl Server,可以很好地縮放。這不是魔術,而是對重視清晰度和控制的GO開發人員的正確權衡。
以上是在GO中構建GraphQl Server的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

答案是:Go應用沒有強制項目佈局,但社區普遍採用一種標準結構以提升可維護性和擴展性。 1.cmd/存放程序入口,每個子目錄對應一個可執行文件,如cmd/myapp/main.go;2.internal/存放私有代碼,不可被外部模塊導入,用於封裝業務邏輯和服務;3.pkg/存放可公開復用的庫,供其他項目導入;4.api/可選,存放OpenAPI、Protobuf等API定義文件;5.config/、scripts/、web/分別存放配置文件、腳本和Web資源;6.根目錄包含go.mod和go.sum

使用bufio.Scanner是Go中逐行讀取文件最常見且高效的方法,適用於處理大文件、日誌解析或配置文件等場景。 1.使用os.Open打開文件並確保通過deferfile.Close()關閉文件。 2.通過bufio.NewScanner創建掃描器實例。 3.在for循環中調用scanner.Scan()逐行讀取,直到返回false表示到達文件末尾或出錯。 4.使用scanner.Text()獲取當前行內容(不含換行符)。 5.循環結束後檢查scanner.Err()以捕獲可能的讀取錯誤。此方法內存效

Go中的if-else語句無需括號但必須使用花括號,支持在if中初始化變量以限製作用域,可通過elseif鍊式判斷條件,常用於錯誤檢查,且變量聲明與條件結合可提升代碼簡潔性與安全性。

Go的flag包可輕鬆解析命令行參數,1.使用flag.Type()定義字符串、整型、布爾等類型標誌;2.可通過flag.TypeVar()將標誌解析到變量避免指針操作;3.調用flag.Parse()後,用flag.Args()獲取後續位置參數;4.實現flag.Value接口可支持自定義類型,滿足多數簡單CLI需求,複雜場景可用spf13/cobra庫替代。

gorun是一個用於快速編譯並執行Go程序的命令,1.它在一步中完成編譯和運行,生成臨時可執行文件並在程序結束後刪除;2.適用於包含main函數的獨立程序,便於開發和測試;3.支持多文件運行,可通過gorun*.go或列出所有文件執行;4.自動處理依賴,利用模塊系統解析外部包;5.不適用於庫或包,且不生成持久化二進製文件,因此適合腳本、學習和頻繁修改時的快速測試,是一種高效、簡潔的即時運行方式。

Go應用中的路由選擇取決於項目複雜度,1.使用標準庫net/httpServeMux適合簡單應用,無需外部依賴且輕量,但不支持URL參數和高級匹配;2.第三方路由器如Chi提供中間件、路徑參數和嵌套路由,適合模塊化設計;3.Gin性能優異,內置JSON處理和豐富功能,適合API和微服務。應根據是否需要靈活性、性能或功能集成來選擇,小型項目用標準庫,中大型項目推薦Chi或Gin,最終實現從簡單到復雜的平滑擴展。

在Go中,常量使用const關鍵字聲明,且值不可更改,可為無類型或有類型;1.單個常量聲明如constPi=3.14159;2.塊內多個常量聲明如const(Pi=3.14159;Language="Go";IsCool=true);3.顯式類型常量如constSecondsInMinuteint=60;4.使用iota生成枚舉值,如const(Sunday=iota;Monday;Tuesday)將依次賦值0、1、2,且iota可用於位運算等表達式;常量必須在編譯時確定值,

要連接Go中的SQL數據庫,需使用database/sql包和特定數據庫驅動。 1.導入database/sql包和驅動(如github.com/go-sql-driver/mysql),注意驅動前加下劃線表示僅用於初始化;2.使用sql.Open("mysql","user:password@tcp(localhost:3306)/dbname")創建數據庫句柄,並調用db.Ping()驗證連接;3.使用db.Query()執行查詢,db.Exec()執行
