go語言聊天室實(shí)現(xiàn)(八)注冊邏輯的具體操作

在這里首先要引入一個概念,go語言的繼承。
在PHP中,我們?nèi)绻胗靡粋€類去繼承父類,直接用extend方法就可以繼承父類中的方法和屬性。
但是在go中是沒有類的概念的,但是我們可以看到struct和類在很大程度上都是相同的。
如果想在一個struct中繼承另一個struct,直接將父struct放到子struct中就可以完成。

type animal struct{
//這是一個動物類
}
type cat struct{
  //這是一個子類
  //繼承的時候直接將animal放在這里即可
  animal
}

通過上述的操作我們就可以在子類中直接使用父類的屬性和方法了。

type LoginService struct {
    services.CommonService
    common.CommonFunction
    Index int
}

首先我們新建一個LoginService的結(jié)構(gòu)體,并定義一個index,這個index和之前我們創(chuàng)建的索引值是一樣的.
我們?yōu)長oginService創(chuàng)建一個方法,名為Register

func (l *LoginService) Register(umsg common.UserMessage) (result returnData) {
    if umsg.FirstTopic == 0 || umsg.SecondTopic == 0 {
        logs.Error("必須要帶有一級或二級topic才能通過驗(yàn)證!")
    }
    if umsg.UserId == 0 {
        logs.Error("用戶ID不存在,請重試!")
    }
    result = l.saveToRedis(umsg)
    return
}

在這個方法中傳過來的是之前解析的用戶發(fā)送的消息。
做了判斷之后,通過一個saveToRedis方法來進(jìn)行處理。

func (l *LoginService) saveToRedis(umsg common.UserMessage) (result returnData) {
    rk := services.RedisKeyGroupUser
    rk = strings.Replace(rk, "first_topic", strconv.Itoa(umsg.FirstTopic), -1)
    rk = strings.Replace(rk, "second_topic", strconv.Itoa(umsg.SecondTopic), -1)
    fmt.Println("rk==============", rk)
    client, _ := new(pool.Pool).GetRedisInstance()
    defer client.Close()
    userList, err := client.Do("GET", rk)
    if err != nil {
        logs.Error("get user list error:", err)
    }
    userListArr:=strings.Split(l.B2S(userList),",")
    userListArr = append(userListArr, strconv.Itoa(umsg.UserId))
    userListArr = l.UniqueArr(userListArr)
    client.Do("SET", rk, strings.Replace(strings.Trim(fmt.Sprint(userListArr), "[]"), " ", ",", -1))

    //存入用戶-組
    rk = services.RedisKeyUserGroup
    rk = strings.Replace(rk, "fd", strconv.Itoa(l.Index), -1)
    fmt.Println("rk===============", rk)
    client.Do("SET", rk, strconv.Itoa(umsg.FirstTopic)+"_"+strconv.Itoa(umsg.SecondTopic))
    //用戶對應(yīng)的fd
    client.Do("HSET", services.UserBindRedisKey, strconv.Itoa(l.Index), strconv.Itoa(umsg.UserId))
    //fd對應(yīng)的user
    client.Do("HSET", services.FdBindUserRedisKey, strconv.Itoa(umsg.UserId), strconv.Itoa(l.Index))

    return

}

在我們初始化Redis實(shí)例之后,定義了一個defer.
defer相當(dāng)于PHP的析構(gòu)方法,在邏輯執(zhí)行完成之后,總是會被調(diào)用一次,在這里我們可以做一些自定義的操作。
對于數(shù)據(jù)的操作與之前使用Swoole進(jìn)行的操作也是基本一樣的,值得注意的是,Redis返回的數(shù)據(jù)結(jié)構(gòu)是[]uint8類型的,我們需要將其轉(zhuǎn)換為string類型來進(jìn)行使用。

//將redis返回的數(shù)據(jù)轉(zhuǎn)換為字符串。
func (c *CommonFunction) B2S(bs interface{}) string {
    ba := []byte{}
    if s,ok:=bs.([]uint8);ok{
        for _, b := range s {
            ba = append(ba, byte(b))
        }
    }
    return string(ba)
}

具體的操作是通過這個結(jié)構(gòu)體來完成的。
完成了這一步,我們也就已經(jīng)完成了整個注冊邏輯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,115評論 2 9
  • 包含的重點(diǎn)內(nèi)容:JAVA基礎(chǔ)JVM 知識開源框架知識操作系統(tǒng)多線程TCP 與 HTTP架構(gòu)設(shè)計(jì)與分布式算法數(shù)據(jù)庫知...
    消失er閱讀 4,543評論 1 10
  • Swift官方文檔的詞匯結(jié)構(gòu)中, 有非常多的關(guān)鍵字, 它們被用于聲明中、語句中、表達(dá)式中、類中、模式中, 還有以數(shù)...
    小宇宙_fly閱讀 867評論 0 3
  • 晚上回到北嶺,居然有兩個停車位。 晚上拒絕了炸雞腿的誘惑。 睡足了七個半小時,在陽光里醒來。 而且昨天中午嗓子里好...
    斑駁的顏色閱讀 191評論 0 0
  • 她 裹著一襲黑夜向前走 手中牽著一條黎明的狗 她 把銀色的年華拋向風(fēng)中 嘴唇依舊熱愛玫瑰的鮮紅 她 眼額堆積著逝去...
    飯團(tuán)不餓閱讀 324評論 2 3

友情鏈接更多精彩內(nèi)容