亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

引言

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

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

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

Go中的不定參數(shù)

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

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

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

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

這里需要注意兩點:

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

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

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

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

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

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

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

直到最近在使用GROM的過程中,面對復雜的業(yè)務(wù)邏輯,當model層定制的方法越來越多,總覺得力不從心。直到一次review代碼時,經(jīng)過我們組賴老師的指點,才算給我的代碼世界又打開了一扇新大門。

先看一段代碼:

// 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),我們定義了一個QueryByUserID 的方法,為了表意這里刻意傳入了一個參數(shù);好像這個函數(shù)已經(jīng)能幫我們解決model層與controller的分離。但是如果真正使用時會發(fā)現(xiàn),其實這個函數(shù)有很大的局限性:它只能獲取某個UserID的所有的話題,卻無法實現(xiàn)對這個UserID下話題的進一步篩選(比如獲取最近七天發(fā)布的話題)。

那么應(yīng)該如何定義這個Query函數(shù),使得我們使用時既優(yōu)雅又功能強大呢?答案便是不定參數(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的最后強行添加了一個args不定參數(shù),從而接受調(diào)用時傳入的附加的參數(shù)。同時在函數(shù)體內(nèi),我們根據(jù)args的長度對它進行不同方式的應(yīng)用,這就非常優(yōu)雅地擴展了QueryByUserID的功能。根據(jù)GORM的特性,大量使用了Go的反射特性,查看源碼后知道這種用法完全可行。

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

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

非常靈活,好喜歡!

小結(jié)

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

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

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

相關(guān)文章

  • Go語言基礎(chǔ)學習之Context的使用詳解

    Go語言基礎(chǔ)學習之Context的使用詳解

    在Go語言中,Context是一個非常重要的概念,它用于在不同的?goroutine?之間傳遞請求域的相關(guān)數(shù)據(jù),本文將深入探討Go語言中?Context特性和Context的高級使用方法,希望對大家有所幫助
    2023-05-05
  • golang?gorm框架數(shù)據(jù)庫的連接操作示例

    golang?gorm框架數(shù)據(jù)庫的連接操作示例

    這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang實現(xiàn)斷點續(xù)傳功能

    Golang實現(xiàn)斷點續(xù)傳功能

    這篇文章主要為大家詳細介紹了Golang實現(xiàn)斷點續(xù)傳、復制文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • go string to int 字符串與整數(shù)型的互換方式

    go string to int 字符串與整數(shù)型的互換方式

    這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解Golang官方中的一致性哈希組件

    詳解Golang官方中的一致性哈希組件

    這篇文章主要為大家詳細介紹了Golang官方中的一致性哈希組件的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-04-04
  • golang中配置?sql.DB獲得更好的性能

    golang中配置?sql.DB獲得更好的性能

    這篇文章主要介紹了golang中如何配置?sql.DB獲得更好的性能,在這篇文章中,我想準確解釋這些設(shè)置的作用,并展示它們可能產(chǎn)生的(積極和消極)影響,需要的朋友可以參考下
    2023-10-10
  • 詳解Go 結(jié)構(gòu)體格式化輸出

    詳解Go 結(jié)構(gòu)體格式化輸出

    這篇文章主要介紹了Go 結(jié)構(gòu)體格式化輸出的相關(guān)資料,幫助大家更好的理解和學習go語言,感興趣的朋友可以了解下
    2020-08-08
  • GoLang jwt無感刷新與SSO單點登錄限制解除方法詳解

    GoLang jwt無感刷新與SSO單點登錄限制解除方法詳解

    這篇文章主要介紹了GoLang jwt無感刷新與SSO單點登錄限制解除方法,JWT是一個簽名的JSON對象,通常用作Oauth2的Bearer token,JWT包括三個用.分割的部分。本文將利用JWT進行認證和加密,感興趣的可以了解一下
    2023-03-03
  • golang基礎(chǔ)之Interface接口的使用

    golang基礎(chǔ)之Interface接口的使用

    這篇文章主要介紹了golang基礎(chǔ)之Interface接口的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Go項目中添加生成時間與版本信息的方法

    Go項目中添加生成時間與版本信息的方法

    本文主要介紹了Go項目中添加生成時間與版本信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論