第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

Gin最新版入門與案例實戰(zhàn)

難度入門
時長 2小時30分
學(xué)習(xí)人數(shù)
綜合評分9.33
7人評價 查看評價
10.0 內(nèi)容實用
9.4 簡潔易懂
8.6 邏輯清晰
  • 這塊需要結(jié)合官方最新文檔寫。

    和視頻中的版本略有差異

    這里貼出我的

    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ū)動

    go?get?-u?gorm.io/driver/mysql
    查看全部
  • package?main
    
    
    
    import?(
    
    ????"fmt"
    
    )
    
    
    
    func?main()?{
    
    ????fmt.Println("程序開始")
    
    ????safeFunction()
    
    ????fmt.Println("程序繼續(xù)運行...")
    
    }
    
    
    
    func?safeFunction()?{
    
    ????defer?func()?{
    
    ????????if?r?:=?recover();?r?!=?nil?{?//?捕獲?panic
    
    ????????????fmt.Println("捕獲到異常:",?r)
    
    ????????}
    
    ????}()
    
    ????
    
    ????fmt.Println("執(zhí)行函數(shù)")
    
    ????panic("觸發(fā)異常")??//?觸發(fā)?panic,程序中斷
    
    ????fmt.Println("這行代碼不會執(zhí)行")
    
    }
    查看全部
  • 思考:這里?err?:=?context.BindJSON(&parms)?可以寫成?err?:=?context.BindJSON(parms)?嗎?
    /*
    ????答:不可以寫成?err?:=?context.BindJSON(parms),因為?BindJSON?需要一個指針類型的參數(shù),即傳入的參數(shù)必須是指向接收數(shù)據(jù)的變量的指針。
    
    ????在?err?:=?context.BindJSON(&parms)?中,&parms?是?parms?的指針,指向這個?map,所以?BindJSON?可以直接修改?parms?的內(nèi)容,將請求中的?JSON?數(shù)據(jù)解析并賦值到?parms?中。如果寫成?context.BindJSON(parms),則傳入的是?map?值的副本,BindJSON?將無法正確解析并賦值給?parms。
    
    ????為什么?BindJSON?需要指針?
    
    ????BindJSON?的參數(shù)類型是?interface{},在?Go?中,如果要通過一個函數(shù)修改參數(shù)的內(nèi)容,必須傳遞指針,這樣函數(shù)才能直接操作參數(shù)的內(nèi)存地址,進(jìn)而修改參數(shù)的值。否則,如果傳遞的是值類型,Go?語言會復(fù)制該值,導(dǎo)致函數(shù)內(nèi)對該副本的修改不會影響到原始變量。
    
    ????示例對比
    
    ????以下是對比:
    
    ????正確寫法
    
    ????parms?:=?make(map[string]interface{})
    ????err?:=?context.BindJSON(&parms)??//?傳入指針
    ????//?解析后?parms?中將包含?JSON?數(shù)據(jù)
    
    ????錯誤寫法
    
    ????parms?:=?make(map[string]interface{})
    ????err?:=?context.BindJSON(parms)??//?傳入值,解析無法修改?parms?內(nèi)容
    ????//?解析不會修改?parms?的內(nèi)容
    
    ????小結(jié)
    
    ????總之,context.BindJSON?需要一個指針類型的參數(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)?可以寫成?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)
    }
    查看全部
  • 簡單示例
    
    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,?"沒有相關(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?路由,這里方法名要大寫,因為要導(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ǔ)充一個?關(guān)于?類型的值實例?和?類型的指針實例?區(qū)別、
    
    &JsonStruct{}?和?JsonStruct{}?在?Go?中的區(qū)別在于它們的內(nèi)存分配和類型。
    ????1.?JsonStruct{}:表示創(chuàng)建一個?JsonStruct?類型的值實例。
    ???????直接使用?JsonStruct{}?會在棧上分配一個?JsonStruct?類型的值,表示這個結(jié)構(gòu)體的值本身。
    ???????當(dāng)你使用?JsonStruct{}?時,得到的是一個結(jié)構(gòu)體的副本。
    ????2.?&JsonStruct{}:表示創(chuàng)建一個?JsonStruct?類型的指針實例。
    ???????使用?&JsonStruct{}?會在堆上分配結(jié)構(gòu)體值并返回一個指向該值的指針(類型為?*JsonStruct)。
    ???????返回的指針允許你直接修改結(jié)構(gòu)體字段,而不會產(chǎn)生副本。
    
    示例
    
    假設(shè)有以下?JsonStruct?結(jié)構(gòu)體:
    
    type?JsonStruct?struct?{
    ????Code?int
    ????Msg??string
    }
    
    然后我們來對比兩種創(chuàng)建方式的不同:
    
    //?創(chuàng)建一個?JsonStruct?值實例
    jsonValue?:=?JsonStruct{Code:?200,?Msg:?"Success"}
    
    //?創(chuàng)建一個?JsonStruct?指針實例
    jsonPointer?:=?&JsonStruct{Code:?200,?Msg:?"Success"}
    
    使用場景
    
    ???????值實例?(JsonStruct{}):
    ???????適合在不需要對原始數(shù)據(jù)進(jìn)行修改或傳遞副本時使用。
    ???????不適合處理大量數(shù)據(jù),因為每次傳遞時都會復(fù)制結(jié)構(gòu)體的數(shù)據(jù)。
    ???????指針實例?(&JsonStruct{}):
    ???????適合在需要修改結(jié)構(gòu)體字段,或在函數(shù)中傳遞以節(jié)省內(nèi)存時使用。
    ???????對于較大結(jié)構(gòu)體,指針實例更高效,因為不需要復(fù)制整個結(jié)構(gòu)體。
    
    示例:在函數(shù)中傳遞
    
    func?modifyValue(js?JsonStruct)?{
    ????js.Code?=?500?//?只會修改副本
    }
    
    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)體的值實例,每次使用時生成一個副本。
    ???????&JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的指針實例,直接操作原始數(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ǔ)充一個?關(guān)于?類型的值實例?和?類型的指針實例?區(qū)別、
    
    &JsonStruct{}?和?JsonStruct{}?在?Go?中的區(qū)別在于它們的內(nèi)存分配和類型。
    ????1.?JsonStruct{}:表示創(chuàng)建一個?JsonStruct?類型的值實例。
    ???????直接使用?JsonStruct{}?會在棧上分配一個?JsonStruct?類型的值,表示這個結(jié)構(gòu)體的值本身。
    ???????當(dāng)你使用?JsonStruct{}?時,得到的是一個結(jié)構(gòu)體的副本。
    ????2.?&JsonStruct{}:表示創(chuàng)建一個?JsonStruct?類型的指針實例。
    ???????使用?&JsonStruct{}?會在堆上分配結(jié)構(gòu)體值并返回一個指向該值的指針(類型為?*JsonStruct)。
    ???????返回的指針允許你直接修改結(jié)構(gòu)體字段,而不會產(chǎn)生副本。
    
    示例
    
    假設(shè)有以下?JsonStruct?結(jié)構(gòu)體:
    
    type?JsonStruct?struct?{
    ????Code?int
    ????Msg??string
    }
    
    然后我們來對比兩種創(chuàng)建方式的不同:
    
    //?創(chuàng)建一個?JsonStruct?值實例
    jsonValue?:=?JsonStruct{Code:?200,?Msg:?"Success"}
    
    //?創(chuàng)建一個?JsonStruct?指針實例
    jsonPointer?:=?&JsonStruct{Code:?200,?Msg:?"Success"}
    
    使用場景
    
    ???????值實例?(JsonStruct{}):
    ???????適合在不需要對原始數(shù)據(jù)進(jìn)行修改或傳遞副本時使用。
    ???????不適合處理大量數(shù)據(jù),因為每次傳遞時都會復(fù)制結(jié)構(gòu)體的數(shù)據(jù)。
    ???????指針實例?(&JsonStruct{}):
    ???????適合在需要修改結(jié)構(gòu)體字段,或在函數(shù)中傳遞以節(jié)省內(nèi)存時使用。
    ???????對于較大結(jié)構(gòu)體,指針實例更高效,因為不需要復(fù)制整個結(jié)構(gòu)體。
    
    示例:在函數(shù)中傳遞
    
    func?modifyValue(js?JsonStruct)?{
    ????js.Code?=?500?//?只會修改副本
    }
    
    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)體的值實例,每次使用時生成一個副本。
    ???????&JsonStruct{}:創(chuàng)建結(jié)構(gòu)體的指針實例,直接操作原始數(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?路由,這里方法名要大寫,因為要導(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
    }


    對核心代碼做一些解釋

    ? 函數(shù)聲明:

    ? func Router() 表示定義一個名為 Router 的函數(shù)。

    ? 返回值 *gin.Engine 表示這個函數(shù)返回一個指向 gin.Engine 實例的指針,gin.Engine 是 Gin 框架的核心路由器。

    ? *gin.Engine:

    ? gin.Engine 是 Gin 的核心類型,代表整個 HTTP 路由器和中間件系統(tǒng)。

    ? 通過 gin.Engine 實例,可以定義應(yīng)用的路由、請求處理邏輯、中間件等。

    查看全部
  • 還是比較有幫助的,點個贊

    查看全部
    0 采集 收起 來源:導(dǎo)學(xué)

    2024-04-07

  • defer:延遲執(zhí)行,先defer的后執(zhí)行

    panic 程序直接終止

    recover在defer中執(zhí)行,讓程序恢復(fù)正常的狀態(tài)去執(zhí)行

    查看全部
  • 3-4章節(jié)大綱課后復(fù)習(xí)大綱

    1. 如何獲取get方式xxx?id=xxx&name=xxx中的id和name

    2. 如何獲取post方式請求的body中的表單對象

    3. 如何獲取post方式請求的body中的json對象(map和結(jié)構(gòu)體兩種方式獲取)

    查看全部
  • 記錄一下,很有幫助655479660001416009720608.jpg
    查看全部
    1 采集 收起 來源:導(dǎo)學(xué)

    2023-11-15

  • 66666666666666

    查看全部
  • 產(chǎn)品經(jīng)理不一定要有獨立編碼能力,但是適當(dāng)了解一些技術(shù)原理,不至于提出“App的主題顏色根據(jù)手機(jī)外殼的顏色來自動調(diào)整”的這種需求了解一些常用的專業(yè)技術(shù)術(shù)語,可以更好的和程序員溝通協(xié)作,當(dāng)程序員討論構(gòu)建某個功能時,咱們至少要能聽懂他們在講什么,問題出在哪里。

    一、懂技術(shù)的產(chǎn)品經(jīng)理有三大優(yōu)勢

    1. 懂技術(shù)的產(chǎn)品經(jīng)理,和開發(fā)的溝通更順暢

    聽得懂技術(shù)專業(yè)術(shù)語,明白技術(shù)實現(xiàn)原理,在傳遞需求時更容易讓技術(shù)同學(xué)理解,達(dá)成共識。

    撰寫PRD或需求評審時,知道技術(shù)關(guān)心什么,對技術(shù)細(xì)節(jié)的闡述更加到位全面。

    線上有異常時,快速定位問題范圍,找到相應(yīng)的技術(shù)同事,加速問題的修復(fù)。

    查看全部
  • 記錄下來

    查看全部
    0 采集 收起 來源:導(dǎo)學(xué)

    2023-08-12

  • 還可以

    查看全部
    0 采集 收起 來源:導(dǎo)學(xué)

    2023-08-12

  • 不錯

    查看全部
    0 采集 收起 來源:導(dǎo)學(xué)

    2023-08-12

  • 1

    查看全部
    0 采集 收起 來源:導(dǎo)學(xué)

    2023-07-27

首頁上一頁12下一頁尾頁

舉報

0/150
提交
取消
課程須知
會Go語言基礎(chǔ)語法
老師告訴你能學(xué)到什么?
1.快速搭建Gin開發(fā)框架,可以在企業(yè)中開發(fā)項目,為小伙伴在企業(yè)中使用做好基礎(chǔ) 2.能夠使用Gin框架開發(fā)項目 3.了解助力榜實現(xiàn)方案,以及通過redis優(yōu)化的方案 4.了解Go語言線上部署 5.利用寶塔搭建web服務(wù)器

微信掃碼,參與3人拼團(tuán)

微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復(fù)購買,感謝您對慕課網(wǎng)的支持!