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

GORM不定參數(shù)的用法最佳實(shí)踐

 更新時(shí)間:2023年12月19日 11:57:27   作者:Go學(xué)堂  
這篇文章主要為大家介紹了GORM不定參數(shù)的用法最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

這篇文章介紹本人非常喜歡的一個(gè)經(jīng)驗(yàn):不定參數(shù)(即…運(yùn)算符)在GORM中的使用。

入門√——初級(jí)——中級(jí)——高級(jí);本文適應(yīng)入門及以上。

GORM最佳實(shí)踐之不定參數(shù)的用法

Go中的不定參數(shù)

在Golang的語(yǔ)言特性文檔中,對(duì)不定參數(shù)(… 參數(shù))進(jìn)行了專門的講解。當(dāng)在函數(shù)定義中聲明了一個(gè)不定參數(shù)…T(比如 func Greeting(prefix string, who ...string))時(shí),在函數(shù)內(nèi)部就相當(dāng)于有了一個(gè)類型為[]T的變量(比如在Greeting函數(shù)內(nèi),存在一個(gè)類型為[]stringwho)。

如果有下面的Greeting函數(shù):

func Greeting(prefix string, who ...string){
 fmt.Println(prefix, len(who), who)
 if len(who) > 0 {
  Greeting(prefix, who[1:]...)
 }
}

那么可以通過(guò)Greeting("nobody")Greeting("hello:", "KiKi", "Joe", "Anna")來(lái)調(diào)用Greeting方法。對(duì)于前者用法來(lái)說(shuō),who的值為nil;對(duì)于后者用法來(lái)說(shuō),who的值為[]string{"KiKi", "Joe", "Anna"}。

這里需要注意兩點(diǎn):

1)不能直接傳入字符串切片調(diào)用Greeting("hello:", []string{"KiKi", "Joe", "Anna"}),否則編譯器會(huì)報(bào)錯(cuò)。

2)也不能這么調(diào)用Greeting(prefix, who[1:]),必須要傳入who[1:]...。

這兩點(diǎn)基本上能揭露出不定參數(shù)的本質(zhì),它更像是聲明運(yùn)算過(guò)程而非數(shù)據(jù)類型

①當(dāng)在函數(shù)聲明中使用時(shí),做的是把函數(shù)調(diào)用時(shí)傳入的參數(shù)組裝成為切片(slice)

②當(dāng)在函數(shù)體內(nèi)部傳參使用時(shí),代表的是把切片中的數(shù)據(jù)拆組成為單個(gè)元素。恩,基本上就是這樣了。

GROM中不定參數(shù)的最佳實(shí)踐

說(shuō)實(shí)話,在剛開(kāi)始接觸不定參數(shù)時(shí),并不覺(jué)得它存在的必要性;平日里編寫代碼很少用到它,感覺(jué)它就像是一個(gè)玩具,或者像是語(yǔ)言的一個(gè)噱頭。

直到最近在使用GROM的過(guò)程中,面對(duì)復(fù)雜的業(yè)務(wù)邏輯,當(dāng)model層定制的方法越來(lái)越多,總覺(jué)得力不從心。直到一次review代碼時(shí),經(jīng)過(guò)我們組賴?yán)蠋煹闹更c(diǎn),才算給我的代碼世界又打開(kāi)了一扇新大門。

先看一段代碼:

// Topic 話題
type Topic struct {
 gorm.Model
 Title         string    `gorm:"index"`
 Content       string    `gorm:"type:text"`
 ViewCount     int       `json:"view_count"`
 ReplyCount    int       `json:"reply_count"`
 UserID        int       `gorm:"index" json:"user_id"`
}
// QueryByUserID 根據(jù)UserID獲取話題
func (t *Topic) QueryByUserID(userID int) (topics []Topic, err error) {
 db := config.DB.Where("user_id = ?", userID).Find(&topics).Error
 return
}

為了根據(jù)用戶ID(UserID)獲取到相應(yīng)的話題(Topic),我們定義了一個(gè)QueryByUserID 的方法,為了表意這里刻意傳入了一個(gè)參數(shù);好像這個(gè)函數(shù)已經(jīng)能幫我們解決model層與controller的分離。但是如果真正使用時(shí)會(huì)發(fā)現(xiàn),其實(shí)這個(gè)函數(shù)有很大的局限性:它只能獲取某個(gè)UserID的所有的話題,卻無(wú)法實(shí)現(xiàn)對(duì)這個(gè)UserID下話題的進(jìn)一步篩選(比如獲取最近七天發(fā)布的話題)。

那么應(yīng)該如何定義這個(gè)Query函數(shù),使得我們使用時(shí)既優(yōu)雅又功能強(qiáng)大呢?答案便是不定參數(shù)。

試想,我們把QueryByUserID函數(shù)以如下的方式定義:

// QueryByUserID 根據(jù)UserID獲取話題
func (t *Topic) QueryByUserID(userID int, args ...interface{}) (topics []Topic, err error) {
 db := config.DB.Where("user_id = ?", userID)
 if len(args) >= 2 {
  db = db.Where(args[0], args[1:]...)
 } else if len(args) >= 1 {
  db = db.Where(args[0])
 }
 err = db.Find(&topics).Error
 return
}

我們這里在QueryByUserID的最后強(qiáng)行添加了一個(gè)args不定參數(shù),從而接受調(diào)用時(shí)傳入的附加的參數(shù)。同時(shí)在函數(shù)體內(nèi),我們根據(jù)args的長(zhǎng)度對(duì)它進(jìn)行不同方式的應(yīng)用,這就非常優(yōu)雅地?cái)U(kuò)展了QueryByUserID的功能。根據(jù)GORM的特性,大量使用了Go的反射特性,查看源碼后知道這種用法完全可行。

在添加了不定參數(shù)的情況下,再調(diào)用QueryByUserID的時(shí)候,想要進(jìn)一步精細(xì)地搜索話題,就方便多了。比如,想要獲取UserID為1且最近一周發(fā)布的話題,可以這么寫了:

topics, err := (&Topic{}).QueryByUserID(1, "created_at > ?", time.Now().Add(-7*24*time.Hour)
// ... 其他對(duì)topics 與 err 的處理

非常靈活,好喜歡!

小結(jié)

本文對(duì)Go中的不定參數(shù)、GORM進(jìn)行了簡(jiǎn)單的介紹,并就二者的優(yōu)雅結(jié)合實(shí)踐進(jìn)行了描述。通過(guò)一個(gè)搜索某用戶發(fā)表的話題(Topic)的例子介紹了使用GORM時(shí)加入不定參數(shù)后所帶來(lái)的巨大靈活性。

通過(guò)這樣一種結(jié)合,能夠?qū)Σ欢▍?shù)以及GORM具有更深一步的認(rèn)識(shí),而認(rèn)識(shí)的夠深刻,開(kāi)發(fā)起來(lái)就能更加得心應(yīng)手了??。

更多關(guān)于GORM不定參數(shù)用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang通過(guò)gorm操作sqlite設(shè)置主鍵自增的步驟

    golang通過(guò)gorm操作sqlite設(shè)置主鍵自增的步驟

    這篇文章主要介紹了golang通過(guò)gorm操作sqlite設(shè)置主鍵自增的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 一文帶你了解Go語(yǔ)言中鎖的實(shí)現(xiàn)

    一文帶你了解Go語(yǔ)言中鎖的實(shí)現(xiàn)

    這篇文章主要帶大家一起學(xué)習(xí)一下go鎖和讀寫鎖的總結(jié)文檔,?主要從"參考"部分的文章結(jié)合源碼學(xué)習(xí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • 詳解Go語(yǔ)言中rand(隨機(jī)數(shù))包的使用

    詳解Go語(yǔ)言中rand(隨機(jī)數(shù))包的使用

    在Golang中,有兩個(gè)包提供了rand,分別為math/rand和crypto/rand對(duì)應(yīng)兩種應(yīng)用場(chǎng)景。math/rand包實(shí)現(xiàn)了偽隨機(jī)數(shù)生成器。也就是生成 整形和浮點(diǎn)型;crypto/rand包實(shí)現(xiàn)了用于加解密的更安全的隨機(jī)數(shù)生成器。本文就來(lái)和大家詳細(xì)講講math/rand的使用
    2022-08-08
  • go語(yǔ)言中range用法

    go語(yǔ)言中range用法

    這篇文章主要介紹了go語(yǔ)言中range用法,實(shí)例分析了Go語(yǔ)言中range的功能及使用技巧,需要的朋友可以參考下
    2015-03-03
  • Golang unsafe包中的類型和函數(shù)詳解

    Golang unsafe包中的類型和函數(shù)詳解

    Golang中的unsafe包用于在運(yùn)行時(shí)進(jìn)行低級(jí)別的操作,這些操作通常是不安全的,因?yàn)榭梢源蚱艷olang的類型安全性和內(nèi)存安全性,使用 unsafe包的程序可能會(huì)影響可移植性和兼容性,接下來(lái)看下unsafe包中的類型和函數(shù)
    2023-08-08
  • golang查看CPU使用率與內(nèi)存的方法詳解

    golang查看CPU使用率與內(nèi)存的方法詳解

    這篇文章主要給大家介紹了golang查看CPU使用率與內(nèi)存的方法,以及拓展介紹源碼里//go:指令,文中有詳細(xì)的代碼示例以及圖文介紹,需要的朋友可以參考下
    2023-10-10
  • Go slog 日志打印最佳實(shí)踐案例

    Go slog 日志打印最佳實(shí)踐案例

    Go 1.21 引入了log/slog 包,為Go語(yǔ)言帶來(lái)了原生的結(jié)構(gòu)化日志解決方案,本文將深入探討如何使用slog實(shí)現(xiàn)高效、可靠的日志記錄,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Go語(yǔ)言類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌的具體使用

    Go語(yǔ)言類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌的具體使用

    本文主要介紹了Go語(yǔ)言類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go select 死鎖的一個(gè)細(xì)節(jié)

    Go select 死鎖的一個(gè)細(xì)節(jié)

    這篇文章主要給大家分享的是Go select 死鎖的一個(gè)細(xì)節(jié),文章先是對(duì)主題提出問(wèn)題,然后展開(kāi)內(nèi)容,感興趣的小伙伴可以借鑒一下,希望對(duì)你有所幫助
    2021-10-10
  • Go語(yǔ)言創(chuàng)建、初始化數(shù)組的常見(jiàn)方式匯總

    Go語(yǔ)言創(chuàng)建、初始化數(shù)組的常見(jiàn)方式匯總

    這篇文章主要介紹了Go語(yǔ)言創(chuàng)建、初始化數(shù)組的常見(jiàn)方式,實(shí)例匯總了Go語(yǔ)言操作數(shù)組的常見(jiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

龙岩市| 清水河县| 郧西县| 兰州市| 尼木县| 会理县| 灵武市| 通海县| 竹溪县| 嘉峪关市| 新闻| 桂平市| 和平区| 三门峡市| 图片| 青阳县| 天津市| 徐汇区| 隆回县| 曲沃县| 宜春市| 吴忠市| 木里| 土默特左旗| 台南市| 化隆| 怀安县| 太湖县| 会同县| 澄江县| 牟定县| 高邑县| 军事| 油尖旺区| 新绛县| 南汇区| 南京市| 左云县| 大宁县| 武山县| 屯门区|