-
這塊需要結(jié)合官方最新文檔寫(xiě)。
和視頻中的版本略有差異
這里貼出我的
gorm.io/driver/mysql v1.5.7
gorm.io/gorm v1.25.12?package?dao import?( ????"go-ranking/config" ????"go-ranking/pkg/logger" ????"gorm.io/driver/mysql" ????"gorm.io/gorm" ????"time" ) var?( ????Db??*gorm.DB ????err?error ) func?init()?{ ????Db,?err?=?gorm.Open(mysql.Open(config.Mysqldb),?&gorm.Config{}) ????//?-----------------------?Connection?Pool?Settings?----------------------- ????//?SetMaxIdleConns?sets?the?maximum?number?of?connections?in?the?idle?connection?pool. ????sqlDB,?err?:=?Db.DB() ????if?err?!=?nil?{ ???????logger.Error(map[string]interface{}{"database?error":?err.Error()}) ???????return ????} ????sqlDB.SetMaxIdleConns(10) ????//?SetMaxOpenConns?sets?the?maximum?number?of?open?connections?to?the?database. ????sqlDB.SetMaxOpenConns(100) ????//?SetConnMaxLifetime?sets?the?maximum?amount?of?time?a?connection?may?be?reused. ????sqlDB.SetConnMaxLifetime(time.Hour) }
查看全部 -
安 gorm依賴?
go?get?-u?gorm.io/gorm
安裝 mysql驅(qū)動(dòng)
go?get?-u?gorm.io/driver/mysql
查看全部 -
package?main import?( ????"fmt" ) func?main()?{ ????fmt.Println("程序開(kāi)始") ????safeFunction() ????fmt.Println("程序繼續(xù)運(yùn)行...") } func?safeFunction()?{ ????defer?func()?{ ????????if?r?:=?recover();?r?!=?nil?{?//?捕獲?panic ????????????fmt.Println("捕獲到異常:",?r) ????????} ????}() ???? ????fmt.Println("執(zhí)行函數(shù)") ????panic("觸發(fā)異常")??//?觸發(fā)?panic,程序中斷 ????fmt.Println("這行代碼不會(huì)執(zhí)行") }
查看全部 -
思考:這里?err?:=?context.BindJSON(&parms)?可以寫(xiě)成?err?:=?context.BindJSON(parms)?嗎? /* ????答:不可以寫(xiě)成?err?:=?context.BindJSON(parms),因?yàn)?BindJSON?需要一個(gè)指針類(lèi)型的參數(shù),即傳入的參數(shù)必須是指向接收數(shù)據(jù)的變量的指針。 ????在?err?:=?context.BindJSON(&parms)?中,&parms?是?parms?的指針,指向這個(gè)?map,所以?BindJSON?可以直接修改?parms?的內(nèi)容,將請(qǐng)求中的?JSON?數(shù)據(jù)解析并賦值到?parms?中。如果寫(xiě)成?context.BindJSON(parms),則傳入的是?map?值的副本,BindJSON?將無(wú)法正確解析并賦值給?parms。 ????為什么?BindJSON?需要指針? ????BindJSON?的參數(shù)類(lèi)型是?interface{},在?Go?中,如果要通過(guò)一個(gè)函數(shù)修改參數(shù)的內(nèi)容,必須傳遞指針,這樣函數(shù)才能直接操作參數(shù)的內(nèi)存地址,進(jìn)而修改參數(shù)的值。否則,如果傳遞的是值類(lèi)型,Go?語(yǔ)言會(huì)復(fù)制該值,導(dǎo)致函數(shù)內(nèi)對(duì)該副本的修改不會(huì)影響到原始變量。 ????示例對(duì)比 ????以下是對(duì)比: ????正確寫(xiě)法 ????parms?:=?make(map[string]interface{}) ????err?:=?context.BindJSON(&parms)??//?傳入指針 ????//?解析后?parms?中將包含?JSON?數(shù)據(jù) ????錯(cuò)誤寫(xiě)法 ????parms?:=?make(map[string]interface{}) ????err?:=?context.BindJSON(parms)??//?傳入值,解析無(wú)法修改?parms?內(nèi)容 ????//?解析不會(huì)修改?parms?的內(nèi)容 ????小結(jié) ????總之,context.BindJSON?需要一個(gè)指針類(lèi)型的參數(shù),因此必須使用?&parms。 */ func?(o?OrderControllerStruct)?CreateOrder(context?*gin.Context)?{ ????//name?:=?context.PostForm("name") ????//price?:=?context.PostForm("price") ????//?使用map接受json?數(shù)據(jù) ????parms?:=?make(map[string]interface{}) ????//使用?Gin?的?BindJSON?方法解析?JSON?數(shù)據(jù)并將其綁定到?parms ????//?思考?這里?err?:=?context.BindJSON(&parms)?可以寫(xiě)成?err?:=?context.BindJSON(parms)?嗎? ????//?不可以。 ????err?:=?context.BindJSON(&parms) ????if?err?==?nil?{ ???????common.Succeed(1,?context,?parms,?10,?"訂單創(chuàng)建成功") ????} ????//common.Succeed(1,?context,?name,?10,?price) }
查看全部 -
簡(jiǎn)單示例 func?(o?OrderControllerStruct)?CreateOrder(context?*gin.Context)?{ ????name?:=?context.PostForm("name") ????price?:=?context.PostForm("price") ????common.Succeed(1,?context,?name,?10,?price) }
curl?--location?'http://127.0.0.1:9999/order/create'?\ --form?'name="小蛋糕"'?\ --form?'price="100.00"'
查看全部 -
package?controller import?( ????"github.com/gin-gonic/gin" ????"go-ranking/common" ) type?UserControllerStruct?struct?{ } func?(u?UserControllerStruct)?GetUserInfo(c?*gin.Context)?{ ????common.Failed(4004,?c,?"沒(méi)有相關(guān)信息") } func?(u?UserControllerStruct)?CreateUser(context?*gin.Context)?{ ????common.Succeed(1,?context,?nil,?1,?"創(chuàng)建成功") } func?(u?UserControllerStruct)?DelUser(context?*gin.Context)?{ ????common.Succeed(1,?context,?nil,?1,?"刪除成功") } func?(u?UserControllerStruct)?UpdateUser(context?*gin.Context)?{ ????common.Failed(0,?context,?"刪除失敗") }
package?router import?( ????"github.com/gin-gonic/gin" ????"go-ranking/controller" ) //?Router?路由,這里方法名要大寫(xiě),因?yàn)橐獙?dǎo)出出去,在別的包里使用 func?Router()?*gin.Engine?{ ????r?:=?gin.Default() ????userGroup?:=?r.Group("/user") ????//?注意這里,他們不是一起的。 ????{ ???????userGroup.GET("/info",?controller.UserControllerStruct{}.GetUserInfo) ???????//userGroup.GET("/list",?func(c?*gin.Context)?{ ???????//?c.JSON(http.StatusOK,?gin.H{"message":?"list"}) ???????//}) ???????userGroup.GET("/create",?controller.UserControllerStruct{}.CreateUser) ???????//userGroup.DELETE("/delete",?controller.DelUser) ???????userGroup.GET("/delete",?controller.UserControllerStruct{}.DelUser) ???????userGroup.PUT("/put",?controller.UserControllerStruct{}.UpdateUser) ????} ????return?r }
package?common import?( ????"github.com/gin-gonic/gin" ????"net/http" ) //?json返回的數(shù)據(jù)結(jié)構(gòu) type?JsonStruct?struct?{ ????Code??int?????????`json:"code"` ????Data??interface{}?`json:"data"` ????Count?int64???????`json:"count"` ????Msg???interface{}?`json:"msg"` } type?ErrorStruct?struct?{ ????Code?int?????????`json:"code"` ????Msg??interface{}?`json:"msg"` } func?Succeed(code?int,?c?*gin.Context,?data?interface{},?count?int64,?msg?interface{})?{ ????json?:=?&JsonStruct{code,?data,?count,?msg} ????c.JSON(http.StatusOK,?json) } func?Failed(code?int,?c?*gin.Context,?msg?interface{})?{ ????json?:=?&ErrorStruct{code,?msg} ????c.JSON(http.StatusOK,?json) } //func?Demo(code?int,?c?*gin.Context,?msg?interface{})?{ //??json?:=?&JsonStruct{Code:?code,?Msg:?msg} //??c.JSON(http.StatusOK,?json) //} /** 補(bǔ)充一個(gè)?關(guān)于?類(lèi)型的值實(shí)例?和?類(lèi)型的指針實(shí)例?區(qū)別、 &JsonStruct{}?和?JsonStruct{}?在?Go?中的區(qū)別在于它們的內(nèi)存分配和類(lèi)型。 ????1.?JsonStruct{}:表示創(chuàng)建一個(gè)?JsonStruct?類(lèi)型的值實(shí)例。 ???????直接使用?JsonStruct{}?會(huì)在棧上分配一個(gè)?JsonStruct?類(lèi)型的值,表示這個(gè)結(jié)構(gòu)體的值本身。 ???????當(dāng)你使用?JsonStruct{}?時(shí),得到的是一個(gè)結(jié)構(gòu)體的副本。 ????2.?&JsonStruct{}:表示創(chuàng)建一個(gè)?JsonStruct?類(lèi)型的指針實(shí)例。 ???????使用?&JsonStruct{}?會(huì)在堆上分配結(jié)構(gòu)體值并返回一個(gè)指向該值的指針(類(lèi)型為?*JsonStruct)。 ???????返回的指針允許你直接修改結(jié)構(gòu)體字段,而不會(huì)產(chǎn)生副本。 示例 假設(shè)有以下?JsonStruct?結(jié)構(gòu)體: type?JsonStruct?struct?{ ????Code?int ????Msg??string } 然后我們來(lái)對(duì)比兩種創(chuàng)建方式的不同: //?創(chuàng)建一個(gè)?JsonStruct?值實(shí)例 jsonValue?:=?JsonStruct{Code:?200,?Msg:?"Success"} //?創(chuàng)建一個(gè)?JsonStruct?指針實(shí)例 jsonPointer?:=?&JsonStruct{Code:?200,?Msg:?"Success"} 使用場(chǎng)景 ???????值實(shí)例?(JsonStruct{}): ???????適合在不需要對(duì)原始數(shù)據(jù)進(jìn)行修改或傳遞副本時(shí)使用。 ???????不適合處理大量數(shù)據(jù),因?yàn)槊看蝹鬟f時(shí)都會(huì)復(fù)制結(jié)構(gòu)體的數(shù)據(jù)。 ???????指針實(shí)例?(&JsonStruct{}): ???????適合在需要修改結(jié)構(gòu)體字段,或在函數(shù)中傳遞以節(jié)省內(nèi)存時(shí)使用。 ???????對(duì)于較大結(jié)構(gòu)體,指針實(shí)例更高效,因?yàn)椴恍枰獜?fù)制整個(gè)結(jié)構(gòu)體。 示例:在函數(shù)中傳遞 func?modifyValue(js?JsonStruct)?{ ????js.Code?=?500?//?只會(huì)修改副本 } func?modifyPointer(js?*JsonStruct)?{ ????js.Code?=?500?//?修改指針?biāo)赶虻脑紨?shù)據(jù) } func?main()?{ ????jsValue?:=?JsonStruct{Code:?200,?Msg:?"Original"} ????modifyValue(jsValue) ????fmt.Println(jsValue.Code)?//?輸出:?200?(未修改) ????jsPointer?:=?&JsonStruct{Code:?200,?Msg:?"Original"} ????modifyPointer(jsPointer) ????fmt.Println(jsPointer.Code)?//?輸出:?500?(已修改) } 總結(jié) ???????JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的值實(shí)例,每次使用時(shí)生成一個(gè)副本。 ???????&JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的指針實(shí)例,直接操作原始數(shù)據(jù),更節(jié)省內(nèi)存。 */
查看全部 -
package?common import?( ????"github.com/gin-gonic/gin" ????"net/http" ) //?json返回的數(shù)據(jù)結(jié)構(gòu) type?JsonStruct?struct?{ ????Code??int?????????`json:"code"` ????Data??interface{}?`json:"data"` ????Count?int64???????`json:"count"` ????Msg???interface{}?`json:"msg"` } func?Succeed(code?int,?c?*gin.Context,?data?interface{},?count?int64,?msg?interface{})?{ ????json?:=?&JsonStruct{code,?data,?count,?msg} ????c.JSON(http.StatusOK,?json) } func?failed(code?int,?c?*gin.Context,?msg?interface{})?{ ????json?:=?&JsonStruct{Code:?code,?Msg:?msg} ????c.JSON(http.StatusOK,?json) } /** 補(bǔ)充一個(gè)?關(guān)于?類(lèi)型的值實(shí)例?和?類(lèi)型的指針實(shí)例?區(qū)別、 &JsonStruct{}?和?JsonStruct{}?在?Go?中的區(qū)別在于它們的內(nèi)存分配和類(lèi)型。 ????1.?JsonStruct{}:表示創(chuàng)建一個(gè)?JsonStruct?類(lèi)型的值實(shí)例。 ???????直接使用?JsonStruct{}?會(huì)在棧上分配一個(gè)?JsonStruct?類(lèi)型的值,表示這個(gè)結(jié)構(gòu)體的值本身。 ???????當(dāng)你使用?JsonStruct{}?時(shí),得到的是一個(gè)結(jié)構(gòu)體的副本。 ????2.?&JsonStruct{}:表示創(chuàng)建一個(gè)?JsonStruct?類(lèi)型的指針實(shí)例。 ???????使用?&JsonStruct{}?會(huì)在堆上分配結(jié)構(gòu)體值并返回一個(gè)指向該值的指針(類(lèi)型為?*JsonStruct)。 ???????返回的指針允許你直接修改結(jié)構(gòu)體字段,而不會(huì)產(chǎn)生副本。 示例 假設(shè)有以下?JsonStruct?結(jié)構(gòu)體: type?JsonStruct?struct?{ ????Code?int ????Msg??string } 然后我們來(lái)對(duì)比兩種創(chuàng)建方式的不同: //?創(chuàng)建一個(gè)?JsonStruct?值實(shí)例 jsonValue?:=?JsonStruct{Code:?200,?Msg:?"Success"} //?創(chuàng)建一個(gè)?JsonStruct?指針實(shí)例 jsonPointer?:=?&JsonStruct{Code:?200,?Msg:?"Success"} 使用場(chǎng)景 ???????值實(shí)例?(JsonStruct{}): ???????適合在不需要對(duì)原始數(shù)據(jù)進(jìn)行修改或傳遞副本時(shí)使用。 ???????不適合處理大量數(shù)據(jù),因?yàn)槊看蝹鬟f時(shí)都會(huì)復(fù)制結(jié)構(gòu)體的數(shù)據(jù)。 ???????指針實(shí)例?(&JsonStruct{}): ???????適合在需要修改結(jié)構(gòu)體字段,或在函數(shù)中傳遞以節(jié)省內(nèi)存時(shí)使用。 ???????對(duì)于較大結(jié)構(gòu)體,指針實(shí)例更高效,因?yàn)椴恍枰獜?fù)制整個(gè)結(jié)構(gòu)體。 示例:在函數(shù)中傳遞 func?modifyValue(js?JsonStruct)?{ ????js.Code?=?500?//?只會(huì)修改副本 } func?modifyPointer(js?*JsonStruct)?{ ????js.Code?=?500?//?修改指針?biāo)赶虻脑紨?shù)據(jù) } func?main()?{ ????jsValue?:=?JsonStruct{Code:?200,?Msg:?"Original"} ????modifyValue(jsValue) ????fmt.Println(jsValue.Code)?//?輸出:?200?(未修改) ????jsPointer?:=?&JsonStruct{Code:?200,?Msg:?"Original"} ????modifyPointer(jsPointer) ????fmt.Println(jsPointer.Code)?//?輸出:?500?(已修改) } 總結(jié) ???????JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的值實(shí)例,每次使用時(shí)生成一個(gè)副本。 ???????&JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的指針實(shí)例,直接操作原始數(shù)據(jù),更節(jié)省內(nèi)存。 */
查看全部 -
package?main import?( ????"go-ranking/router" ) func?main()?{ ????r?:=?router.Router() ???? ????r.Run(":9999") }
package?router import?( ????"github.com/gin-gonic/gin" ????"net/http" ) //?Router?路由,這里方法名要大寫(xiě),因?yàn)橐獙?dǎo)出出去,在別的包里使用 func?Router()?*gin.Engine?{ ????r?:=?gin.Default() ????userGroup?:=?r.Group("/user") ????//?注意這里,他們不是一起的。 ????{ ???????userGroup.GET("/list",?func(c?*gin.Context)?{ ??????????c.JSON(http.StatusOK,?gin.H{"message":?"list"}) ???????}) ???????userGroup.POST("/create",?func(c?*gin.Context)?{ ??????????c.JSON(http.StatusOK,?gin.H{"message":?"create"}) ???????}) ???????userGroup.DELETE("/delete",?func(c?*gin.Context)?{ ??????????c.JSON(http.StatusOK,?gin.H{"message":?"delete"}) ???????}) ???????userGroup.PATCH("/patch",?func(c?*gin.Context)?{ ??????????c.JSON(http.StatusOK,?gin.H{"message":?"patch?"}) ???????}) ???????userGroup.PUT("/put",?func(c?*gin.Context)?{ ??????????c.JSON(http.StatusOK,?gin.H{"message":?"put?"}) ???????}) ????} ????return?r }
對(duì)核心代碼做一些解釋
? 函數(shù)聲明:
? func Router() 表示定義一個(gè)名為 Router 的函數(shù)。
? 返回值 *gin.Engine 表示這個(gè)函數(shù)返回一個(gè)指向 gin.Engine 實(shí)例的指針,gin.Engine 是 Gin 框架的核心路由器。
? *gin.Engine:
? gin.Engine 是 Gin 的核心類(lèi)型,代表整個(gè) HTTP 路由器和中間件系統(tǒng)。
? 通過(guò) gin.Engine 實(shí)例,可以定義應(yīng)用的路由、請(qǐng)求處理邏輯、中間件等。
查看全部 -
還是比較有幫助的,點(diǎn)個(gè)贊
查看全部 -
defer:延遲執(zhí)行,先defer的后執(zhí)行
panic 程序直接終止
recover在defer中執(zhí)行,讓程序恢復(fù)正常的狀態(tài)去執(zhí)行
查看全部 -
3-4章節(jié)大綱課后復(fù)習(xí)大綱
如何獲取get方式xxx?id=xxx&name=xxx中的id和name
如何獲取post方式請(qǐng)求的body中的表單對(duì)象
如何獲取post方式請(qǐng)求的body中的json對(duì)象(map和結(jié)構(gòu)體兩種方式獲取)
查看全部 -
記錄一下,很有幫助
查看全部 -
66666666666666
查看全部 -
產(chǎn)品經(jīng)理不一定要有獨(dú)立編碼能力,但是適當(dāng)了解一些技術(shù)原理,不至于提出“App的主題顏色根據(jù)手機(jī)外殼的顏色來(lái)自動(dòng)調(diào)整”的這種需求了解一些常用的專業(yè)技術(shù)術(shù)語(yǔ),可以更好的和程序員溝通協(xié)作,當(dāng)程序員討論構(gòu)建某個(gè)功能時(shí),咱們至少要能聽(tīng)懂他們?cè)谥v什么,問(wèn)題出在哪里。
一、懂技術(shù)的產(chǎn)品經(jīng)理有三大優(yōu)勢(shì)
1. 懂技術(shù)的產(chǎn)品經(jīng)理,和開(kāi)發(fā)的溝通更順暢
聽(tīng)得懂技術(shù)專業(yè)術(shù)語(yǔ),明白技術(shù)實(shí)現(xiàn)原理,在傳遞需求時(shí)更容易讓技術(shù)同學(xué)理解,達(dá)成共識(shí)。
撰寫(xiě)PRD或需求評(píng)審時(shí),知道技術(shù)關(guān)心什么,對(duì)技術(shù)細(xì)節(jié)的闡述更加到位全面。
線上有異常時(shí),快速定位問(wèn)題范圍,找到相應(yīng)的技術(shù)同事,加速問(wèn)題的修復(fù)。
查看全部 -
記錄下來(lái)
查看全部 -
還可以
查看全部 -
不錯(cuò)
查看全部 -
1
查看全部
舉報(bào)