最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoFrame代碼優(yōu)化gconv類型轉(zhuǎn)換避免重復(fù)定義map

 更新時(shí)間:2022年06月13日 09:29:16   作者:王中陽Go  
這篇文章主要為大家介紹了GoFrame代碼優(yōu)化gconv類型轉(zhuǎn)換避免重復(fù)定義map示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近一直在研究 GoFrame 框架,經(jīng)過一段時(shí)間的使用、總結(jié)、思考,發(fā)現(xiàn)確實(shí)不失為一款非常值得使用的企業(yè)級(jí)開發(fā)框架。

在我初識(shí)GoFrame教程后,曾整理過一篇文章: 非常適合PHP同學(xué)學(xué)習(xí)的GO框架:GoFrame,有興趣的同學(xué)可以閱讀一下。

今天重點(diǎn)講一下我使用GoFrame的代碼優(yōu)化之旅。

核心重點(diǎn)

GoFrame幾乎封裝了所有能封裝的東西,而我們需要做的就是在框架的基礎(chǔ)上約定好自己項(xiàng)目的開發(fā)規(guī)范。

一定要遵守統(tǒng)一的規(guī)范!

一定要遵守統(tǒng)一的規(guī)范!

一定要遵守統(tǒng)一的規(guī)范!

類型轉(zhuǎn)換GoFrame框架提供了非常強(qiáng)大易用的類型轉(zhuǎn)換包gconv,可以實(shí)現(xiàn)將常用數(shù)據(jù)類型轉(zhuǎn)換為指定的數(shù)據(jù)類型,對(duì)常用基本數(shù)據(jù)類型之間的無縫轉(zhuǎn)換,同時(shí)也支持任意類型到struct對(duì)象的轉(zhuǎn)換。由于gconv模塊內(nèi)部大量優(yōu)先使用了斷言而非反射,因此執(zhí)行的效率非常高。

數(shù)據(jù)庫ORM:通過Scan方法自動(dòng)識(shí)別Map/Struct接收查詢結(jié)果,自動(dòng)化查詢結(jié)果初始化、結(jié)構(gòu)體類型轉(zhuǎn)換; 完美支持GoFrame框架層面的DAO設(shè)計(jì),全自動(dòng)化Model/DAO代碼生成,極大提高開發(fā)效率。

以上兩個(gè)部分是重中之重,建議大家好好研究。

類型轉(zhuǎn)換 和 數(shù)據(jù)庫ORM 也是我下面優(yōu)化代碼的重要參考。

優(yōu)化前

//獲取商品類目接口
func (s *goMeGoodsService) GetCategory(pid ...interface{}) {
	ctx := context.Background()
	res, err := gome.Category.Get(ctx, pid)
	if err != nil {
		checkErr(err, "GetCategory AddCategory")
	}
	data := res.Data
	for _, v := range data {
		if v.Code != "" && v.Name != "" {
			_, err = s.AddCategory(v.Level, v.Code, v.Name, v.ParentCode)
			checkErr(err, "GetCategory AddCategory")
		}
	}
}
//添加分類
func (s *goMeGoodsService) AddCategory(level int, code, name, parent_code string) (id int64, err error) {
	categoryMapping := map[string]interface{}{
		"level":       level,
		"code":        code,
		"name":        name,
		"parent_code": parent_code,
	}
	sqlRes, err := dao.GomeCategory.Data(categoryMapping).Insert()
	if err != nil {
		return
	}
	id, err = sqlRes.RowsAffected()
	if err != nil {
		return
	}
	return
}

這種重復(fù)定義讓我很難受:

categoryMapping := map[string]interface{}{
		"level":       level,
		"code":        code,
		"name":        name,
		"parent_code": parent_code,
	}

優(yōu)化后:

去掉定義map:

//獲取商品類目接口
func (s *goMeGoodsService) GetCategory(pid ...interface{}) {
	ctx := context.Background()
	res, err := gome.Category.Get(ctx, pid)
	if err != nil {
		checkErr(err, "GetCategory AddCategory")
	}
        //循環(huán)單條插入
        for _, v := range res.Data {
         _, err := dao.GomeCategory.Data(v).Insert()
         if err != nil {
            checkErrGome(err, "db添加分類失敗")
         }
        }
}

可以這么寫的原因

func (categoryGome) Get(ctx context.Context, pid ...interface{}) (res *CategoryRes, err error) {
	method := "alemein.basic.get.category"
	req := g.Map{}
	if len(pid) > 0 {
		req["parentCode"] = pid[0]
	}
	result, err := server.requestApi(ctx, method, req)
	if err != nil {
		return
	}
	_ = gjson.New(result).Scan(&res)
	return
}

gome.Category.Get(ctx, pid) 返回的是 CategoryRes結(jié)構(gòu)體:

type CategoryRes struct {
	*CommonRes
	Data []struct {
		Code       string `json:"code"`
		Level      int    `json:"level"`
		ParentCode string `json:"parentCode"`
		Name       string `json:"name"`
	} `json:"data"`
}

進(jìn)一步優(yōu)化 批量寫入

CategoryRes.Data 就是需要入庫的數(shù)組,我們直接使用Data()函數(shù)賦值,進(jìn)行批量插入就行了。(默認(rèn)每次插入10條數(shù)據(jù),可以通過batch(x)指定每次插入的數(shù)據(jù)條數(shù))

dao.GomeCategory.Data(res.Data).Insert()

更優(yōu)雅的寫法如下

//獲取商品類目接口
func (s *goMeGoodsService) GetCategory() {
	ctx := context.Background()
	//一級(jí)類名
	res, err := gome.Category.Get(ctx)
	if err != nil {
		checkErr(err, "GetCategory AddCategory")
	}
	//批量插入 優(yōu)雅
	_, batchErr := dao.GomeCategory.Data(res.Data).Insert()
	if batchErr != nil {
		checkErr(batchErr, "批量更新一級(jí)目錄失敗")
	}
}

可以向上滑,看看優(yōu)化前的代碼是怎么寫的。

優(yōu)化后的代碼完全實(shí)現(xiàn)了優(yōu)化代碼前的功能,且性能更好,因?yàn)槭褂昧伺坎迦搿?/p>

總結(jié)

避免這種重復(fù)定義map的代碼, 合理使用gconv對(duì)map、結(jié)構(gòu)體、結(jié)構(gòu)體數(shù)組進(jìn)行轉(zhuǎn)換。

不要像下面這樣寫代碼!NO!

//添加分類 
func (s *goMeGoodsService) AddCategory(level int, code, name, parent_code string) (id int64, err error) {
	categoryMapping := map[string]interface{}{
		"level":       level,
		"code":        code,
		"name":        name,
		"parent_code": parent_code,
	}
	sqlRes, err := dao.GomeCategory.Data(categoryMapping).Insert()
	if err != nil {
		return
	}
	id, err = sqlRes.RowsAffected()
	if err != nil {
		return
	}
	return
}

要有這種優(yōu)化代碼的意識(shí),當(dāng)我們意識(shí)到重復(fù)定義時(shí),就一定有辦法優(yōu)化。

當(dāng)我們意識(shí)到邏輯混亂時(shí),就一定有辦法優(yōu)化結(jié)構(gòu),混亂的邏輯往往是設(shè)計(jì)的不合理導(dǎo)致的。

以上就是GoFrame代碼優(yōu)化gconv類型轉(zhuǎn)換避免重復(fù)定義map的詳細(xì)內(nèi)容,更多關(guān)于GoFrame gconv類型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang實(shí)現(xiàn)延遲調(diào)用的項(xiàng)目實(shí)踐

    Golang實(shí)現(xiàn)延遲調(diào)用的項(xiàng)目實(shí)踐

    本文主要介紹了Golang實(shí)現(xiàn)延遲調(diào)用的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Go語言實(shí)現(xiàn)定時(shí)器的原理及使用詳解

    Go語言實(shí)現(xiàn)定時(shí)器的原理及使用詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)定時(shí)器的兩種方法:一次性定時(shí)器(Timer)和周期性定時(shí)器(Ticker),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • Go 1.22對(duì)net/http包的路由增強(qiáng)功能詳解

    Go 1.22對(duì)net/http包的路由增強(qiáng)功能詳解

    Go 1.22 版本對(duì) net/http 包的路由功能進(jìn)行了增強(qiáng),引入了方法匹配(method matching)和通配符(wildcards)兩項(xiàng)新功能,本文將給大家詳細(xì)的介紹一下Go 1.22對(duì)net/http包的路由增強(qiáng)功能,需要的朋友可以參考下
    2024-02-02
  • Golang使用ReverseProxy實(shí)現(xiàn)反向代理的方法

    Golang使用ReverseProxy實(shí)現(xiàn)反向代理的方法

    本文介紹了如何使用Golang的ReverseProxy實(shí)現(xiàn)反向代理,包括源碼結(jié)構(gòu)解析和官方單機(jī)示例NewSingleHostReverseProxy,同時(shí)指出,若要實(shí)現(xiàn)負(fù)載均衡,需要自行開發(fā),還提供了一個(gè)簡單的HTTP服務(wù)用于測試,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • GO語言中的常量

    GO語言中的常量

    go語言支持的常量有字符型,字符串型,布爾型和數(shù)字型。本文實(shí)例講述了Go語言中常量定義方法。分享給大家供大家參考。
    2015-04-04
  • Go語言使用時(shí)會(huì)遇到的錯(cuò)誤及解決方法詳解

    Go語言使用時(shí)會(huì)遇到的錯(cuò)誤及解決方法詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言使用時(shí)常常會(huì)遇到的一些錯(cuò)誤及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 淺析golang開發(fā)Error的使用詳解

    淺析golang開發(fā)Error的使用詳解

    Error是Go語言開發(fā)中最基礎(chǔ)也是最重要的部分,很多朋友不明白goland error的一些基本使用方法,今天通過本文給大家詳細(xì)介紹下,需要的朋友參考下吧
    2021-07-07
  • 如何在VScode 中編譯多個(gè)Go文件

    如何在VScode 中編譯多個(gè)Go文件

    這篇文章主要介紹了VScode 中編譯多個(gè)Go文件的實(shí)現(xiàn)方法,本文通過實(shí)例圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • golang判斷net.Conn 是否已關(guān)閉的操作

    golang判斷net.Conn 是否已關(guān)閉的操作

    這篇文章主要介紹了golang判斷net.Conn 是否已關(guān)閉的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論

呼伦贝尔市| 同江市| 交口县| 囊谦县| 肇源县| 宁国市| 鱼台县| 安顺市| 龙陵县| 长武县| 博客| 阳江市| 溧阳市| 兰坪| 耒阳市| 华池县| 嵊州市| 石台县| 东兰县| 林芝县| 九龙县| 互助| 社会| 阜城县| 广丰县| 蚌埠市| 阜宁县| 仙游县| 额济纳旗| 昌邑市| 泰和县| 桐乡市| 杂多县| 江孜县| 荆门市| 如东县| 祁连县| 蓬溪县| 哈尔滨市| 文山县| 哈尔滨市|