精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

GoFrame 如何優雅的共享變量?Context的使用

開發 后端
今天就為大家介紹一下Context的使用:告訴大家Context是什么?怎么用?為什么要用Context以及使用中的小技巧和注意問題。

前言

昨天merge代碼,發現了好多沖突,原因是同事在review項目,做鏈路追蹤,發現老項目有不少方法傳參不規范,沒有傳入Context,不方便做鏈路追蹤。

所以把這些方法和調用進行了修改,導致了大量沖突,修復沖突又花了好長時間

所以:傳參規范還是要在項目啟動時就確定好呀,一定要搞清楚Context怎么用呀!

今天就為大家介紹一下Context的使用:

告訴大家Context是什么?怎么用?為什么要用Context以及使用中的小技巧和注意問題。

Context是什么?

Context?指的是標準庫的context.Context?,是一個接口對象,常用于異步IO控制以及上下文流程變量的傳遞。

本文將要介紹的是Context如何優雅的在業務流程中進行變量的傳遞,以及為什么需要要進行變量的傳遞。

為什么需要Context?

在Go?的執行流程中,特別是HTTP/RPC?執行流程中,沒有通過”全局變量”獲取請求參數的方式,只能通過上下文Context變量,傳遞到后續執行流程的方法中。

如何使用?

Context上下文變量,包含了所有需要傳遞的共享變量。

并且Context中的共享變量是需要事先約定的,并且往往存儲為對象指針形式。

通過Context上下文,共享變量非常簡單,下面通過示例帶大家了解一下如何傳遞和使用通用的共享變量。

一、結構定義

上下文對象中往往存儲一些需要共享的變量,這些變量通常使用結構化的對象來存儲,以方便維護。

例如,我們在model定義一個上下文中的共享變量:

const (
// 上下文變量存儲鍵名,前后端系統共享
ContextKey = "ContextKey"
)

// 請求上下文結構
type Context struct {
Session *ghttp.Session // 當前Session管理對象
User *ContextUser // 上下文用戶信息
Data g.Map // 自定KV變量,業務模塊根據需要設置,不固定
}

// 請求上下文中的用戶信息
type ContextUser struct {
Id uint // 用戶ID
Passport string // 用戶賬號
Nickname string // 用戶名稱
Avatar string // 用戶頭像
}

介紹

  • model.ContextKey?常量表示存儲在context.Context?上下文變量中的鍵名,該鍵名用于從傳遞的context.Context變量中存儲/獲取業務自定義的共享變量。
  • model.Context?結構體中的Session?表示當前請求的Session?對象,在GoFrame?框架中每個HTTP?請求對象中都會有一個空的Session對象,該對象采用了懶初始化設計,只有在真正執行讀寫操作時才會初始化。
  • model.Context?結構體中的User?表示當前登錄的用戶基本信息,只有在用戶登錄后才有數據,否則是nil。
  • model.Context?結構體中的Data?,用于存儲自定義的KV?變量,因此一般來說開發者無需再往context.Context?上下文變量中增加自定義的鍵值對,而是直接使用model.Context?對象的這個Data屬性即可。

二、邏輯封裝

由于該上下文對象也是和業務邏輯相關的,因此我們需要通過service對象將上下文變量封裝起來以方便其他模塊使用。

// 上下文管理服務
var Context = new(contextService)

type contextService struct{}

// 初始化上下文對象指針到上下文對象中,以便后續的請求流程中可以修改。
func (s *contextService) Init(r *ghttp.Request, customCtx *model.Context) {
r.SetCtxVar(model.ContextKey, customCtx)
}

// 獲得上下文變量,如果沒有設置,那么返回nil
func (s *contextService) Get(ctx context.Context) *model.Context {
value := ctx.Value(model.ContextKey)
if value == nil {
return nil
}
if localCtx, ok := value.(*model.Context); ok {
return localCtx
}
return nil
}

// 將上下文信息設置到上下文請求中,注意是完整覆蓋
func (s *contextService) SetUser(ctx context.Context, ctxUser *model.ContextUser) {
s.Get(ctx).User = ctxUser
}

Tips

在架構設計中,在哪個場景下設置Context是非常關鍵的。

上下文的變量必須在請求一開始便注入到請求流程中,以便于其他方法調用,所以在中間件中來實現是非常優雅的選擇。

我們來看下面的介紹:

三、上下文變量注入

在HTTP?請求中我們可以使用GoFrame的中間件來實現。

在GRPC請求中我們也可以使用攔截器來實現。

在service?層的middleware管理對象中,我們可以這樣來定義:

// 自定義上下文對象
func (s *middlewareService) Ctx(r *ghttp.Request) {
// 初始化,務必最開始執行
customCtx := &model.Context{
Session: r.Session,
Data: make(g.Map),
}
service.Context.Init(r, customCtx)
if userEntity := Session.GetUser(r.Context()); userEntity != nil {
customCtx.User = &model.ContextUser{
Id: userEntity.Id,
Passport: userEntity.Passport,
Nickname: userEntity.Nickname,
Avatar: userEntity.Avatar,
}
}
// 將自定義的上下文對象傳遞到模板變量中使用
r.Assigns(g.Map{
"Context": customCtx,
})
// 執行下一步請求邏輯
r.Middleware.Next()
}

這個中間件,初始化了用戶執行流程 共享的對象,并且存儲到context.Context?變量中的對象是指針類型*model.Context。

這樣做的好處是:任何一個地方獲取到這個指針,不僅可以獲取到里面的數據,而且能夠直接修改里面的數據。

TIPS

如果Session?中存在用戶登錄后的存儲信息,那么也會將需要共享的用戶基本信息寫入到*model.Context中。

四、上下文變量使用

方法定義

方法定義的第一個輸入參數往往預留給context.Context?類型參數使用,以便接受上下文變量,特別是service層的方法。

例如:

// 執行用戶登錄
func (s *userService) Login(ctx context.Context, loginReq *define.UserServiceLoginReq) error {
...
}

// 查詢內容列表
func (s *contentService) GetList(ctx context.Context, r *define.ContentServiceGetListReq) (*define.ContentServiceGetListRes, error) {
...
}

// 創建回復內容
func (s *replyService) Create(ctx context.Context, r *define.ReplyServiceCreateReq) error {
...
}

TIPS

另外一個好習慣是:方法的最后一個返回參數往往是error?類型。如果確定方法內部永不會產生error,那么可以忽略。

?Context??對象獲取

通過service?中封裝的以下方法,將context.Context上下文變量傳遞進去即可。

context.Context?上下文變量在GoFrame?框架的HTTP?請求中可以通過r.Context()方法獲取。

在GRPC?請求中,編譯生成的pb?文件中執行方法的第一個參數即固定是context.Context。

service.Context.Get(ctx)

自定義?Key-Value?

我們可以通過以下方式設置/獲取自定義的key-value鍵值對。

// 設置自定義鍵值對
service.Context.Get(ctx).Data[key] = value

// 獲取自定義鍵值對
service.Context.Get(ctx).Data[key]

五、注意問題

上下文變量只傳遞必須的鏈路參數數據,不要什么參數都往里面塞。特別是一些方法參數、傳參的數據,千萬不能往上下文里面塞,而應當用顯示的方式傳遞方法參數。

上下文變量僅用作運行時臨時使用,不可做持久化存儲長期使用。

總結

這篇文章詳細的為大家介紹了GoFrame上下文對象Context的知識點:

Context的作用:在業務流程中進行變量的共享。

Context的結構定義、邏輯封裝、如何在中間件中注入、如何通過Context設置值和取值、Context如何自定義key-value、以及在項目開發中使用的注意問題。

歡迎Star GoFrame:https://github.com/gogf/gf

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升級打怪之旅
相關推薦

2023-06-16 09:08:39

ReactContextRFC

2021-08-10 07:41:24

ContextWaitGroupGoroutine

2017-07-26 11:32:50

NETRabbitMQ系統集成

2015-11-26 10:53:45

LinuxWindowsMac OS

2022-11-29 10:42:46

GoFrame技巧腳手架

2022-09-14 08:16:48

裝飾器模式對象

2021-03-28 09:17:18

JVM場景鉤子函數

2025-07-09 07:20:00

GORMGo分頁

2022-06-02 10:02:47

Kubectl更新應用Linux

2019-11-15 09:58:04

LinuxAsciinemapython

2020-05-08 14:45:00

JS代碼變量

2022-02-28 09:19:12

MDK芯片軟件

2022-11-15 07:50:47

ORM鏈式操作刪除

2022-11-11 07:48:56

ORM鏈式輪播圖

2022-01-21 09:45:42

Mozilla SOKubernetesLinux

2021-01-19 10:35:49

JVM場景函數

2022-12-28 12:11:57

PHPGo框架

2020-10-16 11:48:06

服務器系統運維

2020-05-14 09:15:52

設計模式SOLID 原則JS

2017-09-25 16:39:51

移動端
點贊
收藏

51CTO技術棧公眾號

久久成人国产| 深夜福利久久| 天天影视色香欲综合网老头| 久久精彩视频| 中国精品一区二区| 亚洲五月综合| 日韩电影在线观看永久视频免费网站| 国产欧美日韩网站| avtt亚洲| 国产精品一区二区不卡| 日韩av高清不卡| 亚洲欧美精品久久| 国产精品jk白丝蜜臀av小说 | 三级黄色在线视频| 欧美在线免费看视频| 欧美一区二区久久| 欧美 日韩 国产一区| 老司机午夜在线视频| av在线免费不卡| 国产精品夜间视频香蕉| 日韩精品成人在线| 中文字幕一区二区三区久久网站| 亚洲欧美日韩在线一区| 又大又长粗又爽又黄少妇视频| 天堂√8在线中文| √…a在线天堂一区| 久久久久久国产精品mv| 国产成人三级在线播放| 日韩影院免费视频| 91地址最新发布| 国产成人av免费在线观看| 欧美美女在线观看| 精品国内二区三区| 成人不卡免费视频| 九九热线视频只有这里最精品| 亚洲三级在线免费观看| 污视频在线免费观看一区二区三区| 色婷婷激情五月| 国产麻豆精品95视频| 国产精品露脸自拍| 中文字幕在线天堂| 99成人精品| 久久久亚洲成人| 欧美成人精品欧美一级私黄| 天天综合网91| www.日韩av.com| 亚洲成人av免费在线观看| 成人爽a毛片免费啪啪红桃视频| 欧美午夜精品免费| 熟妇人妻无乱码中文字幕真矢织江| 男人av在线播放| 偷偷要91色婷婷| 欧美日韩黄色一级片| 免费看男女www网站入口在线| 午夜精品久久一牛影视| 成人精品视频在线播放| 97人澡人人添人人爽欧美| 亚洲国产一区二区三区青草影视 | 亚洲国产影院| 久久久久久这里只有精品| 九九九久久久久| 国产精品大片| 97在线观看免费| 91九色丨porny丨肉丝| 中文日韩在线| 欧洲成人午夜免费大片| 在线免费一区二区| 精品一区二区影视| 91gao视频| 丰满熟妇乱又伦| 不卡视频一二三| 久久久久久久久久久久久久一区 | 久久亚州av| 亚洲精品美女久久| 久久国产精品影院| 欧美日韩国产高清电影| 亚洲欧洲视频在线| a级黄色免费视频| 一区二区电影在线观看| 欧美激情xxxxx| 国产精久久久久久| 国产乱码精品| 国产日韩精品综合网站| 国产又色又爽又黄又免费| 国产精品亚洲视频| 精品日韩欧美| 北岛玲一区二区三区| 亚洲天堂2014| 国产资源在线视频| 国产激情久久| 亚洲成人精品久久| 欧美午夜激情影院| 欧美精选一区| 2020久久国产精品| 一本色道久久综合无码人妻| 国产精品2024| 国内一区在线| 色欧美激情视频在线| 亚洲午夜在线视频| 超碰在线97免费| 综合视频一区| 中文字幕久热精品在线视频| 久久久久久久国产视频| 日韩精品电影一区亚洲| 亚洲字幕在线观看| 欧美日本韩国一区二区| 亚洲精品美腿丝袜| 精品久久久久久久免费人妻| 欧美第一在线视频| 亚洲色图第一页| 九九热视频精品| 日本美女视频一区二区| 国产女主播一区二区| 在线观看免费黄色| 狠狠干狠狠久久| 日韩a一级欧美一级| 国产麻豆精品久久| 欧美丰满少妇xxxxx| 在线免费看毛片| 久久久久国产一区二区三区四区| 国产免费内射又粗又爽密桃视频| 日本蜜桃在线观看视频| 日韩一区二区免费电影| 自拍偷拍第9页| 久久一二三四| 久久久久久久久久久一区| 欧美bbbxxxxx| 日韩午夜中文字幕| 日本美女黄色一级片| 久久综合图片| 欧美日韩一区二区视频在线观看| 国产偷倩在线播放| 欧美一区二视频| 99久久精品久久亚洲精品| 香蕉久久a毛片| 国产自产在线视频一区| 女子免费在线观看视频www| 欧美日本一区二区| 成人免费视频入口| 免费精品视频最新在线| 日韩av大全| 超碰aⅴ人人做人人爽欧美| 亚洲成年人在线播放| 久一区二区三区| 国产盗摄精品一区二区三区在线| 日韩视频在线免费播放| 日韩毛片免费看| 丝袜美腿精品国产二区| 午夜视频网站在线观看| 国产午夜精品一区二区三区嫩草| 国产日韩一区二区在线| 天堂av一区二区三区在线播放| 国内精品久久久| 色婷婷中文字幕| 欧美日韩中文在线| 好吊视频在线观看| 久久资源在线| 亚洲精品二区| 91麻豆精品国产91久久久更新资源速度超快| 中文字幕欧美国内| 国产免费叼嘿网站免费| 亚洲精品视频在线| 四虎国产精品永久免费观看视频| 女人天堂亚洲aⅴ在线观看| 91久久精品www人人做人人爽| 影院在线观看全集免费观看| 欧美mv和日韩mv国产网站| 免费麻豆国产一区二区三区四区| 国产二区国产一区在线观看| 福利视频一区二区三区四区| 另类图片第一页| 日本伊人精品一区二区三区介绍 | 久久精品成人欧美大片古装| 亚洲一级视频在线观看| 亚洲少妇中出一区| 91精品人妻一区二区三区蜜桃2| 在线日本成人| 欧美国产二区| 欧美一区二区三区婷婷| 美女少妇精品视频| 人妻va精品va欧美va| 欧美性xxxx在线播放| 久久久免费看片| 国产在线播精品第三| www.avtt| 少妇精品久久久一区二区三区| 国产日韩欧美在线| 免费看电影在线| 亚洲人线精品午夜| 国产精品乱码久久久| 亚洲一区二区偷拍精品| 一卡二卡三卡四卡| 国产酒店精品激情| 日批视频在线免费看| 99精品电影| 国产在线精品一区| 成人日韩av| 欧美精品激情在线| 国产youjizz在线| 欧美va亚洲va| 日本中文字幕在线观看视频| 亚洲人亚洲人成电影网站色| 亚洲啪av永久无码精品放毛片| 视频在线观看91| 国产精品久久久久久久乖乖| 国产日产精品一区二区三区四区的观看方式 | 欧美精品一区二| 在线观看国产一区二区三区| 激情懂色av一区av二区av| 国产一二三四视频| 97精品久久久午夜一区二区三区 | 国产91在线播放精品| 欧美精品久久久久a| av在线免费一区| 亚洲激情国产精品| 国产黄色片免费| 欧洲亚洲精品在线| 欧美一级视频免费观看| 亚洲色欲色欲www| 国产熟女一区二区| 91麻豆精品在线观看| 日本r级电影在线观看| 欧美亚洲专区| 国产美女主播在线播放| 99久久夜色精品国产亚洲96 | 中文精品久久| 视频一区视频二区视频| 日韩欧美中文字幕电影| www日韩av| 激情不卡一区二区三区视频在线 | 91午夜在线观看| 亚洲综合自拍| 在线观看欧美一区| blacked蜜桃精品一区| 国产一区二区不卡视频| 亚洲综合影院| 亚洲a∨日韩av高清在线观看| 成人看片毛片免费播放器| 国产成人综合亚洲| 五月天国产在线| 97超级碰碰碰| 国产美女高潮在线观看| 国产69精品久久久久99| 欧美1—12sexvideos| 欧美俄罗斯乱妇| 欧美xxxx性xxxxx高清| 欧美精品亚州精品| 中文字幕伦理免费在线视频 | 国产精品中文欧美| 911福利视频| 久久se精品一区二区| 在线免费视频一区| 日本sm残虐另类| 免费一级特黄录像| 日韩av午夜在线观看| 手机在线免费观看毛片| 日本成人中文字幕| 五月天激情视频在线观看| 日本不卡中文字幕| 国产视频1区2区3区| 久久成人羞羞网站| 亚洲视频在线不卡| 丰满白嫩尤物一区二区| 亚洲乱妇老熟女爽到高潮的片 | 精品视频免费在线| 这里只有精品9| 日韩一区二区三区四区五区六区| 国产精品一区二区人人爽| 日韩欧美一区中文| 国精产品乱码一区一区三区四区| 亚洲成人a级网| 免费av在线电影| 中文字幕在线亚洲| 日本在线观看大片免费视频| 欧美人与性动交| 成人免费观看在线观看| 日韩av片免费在线观看| 欧美男女视频| 成人精品一二区| 日韩极品在线| 亚洲国产精品视频一区| 一本一本久久a久久综合精品| 欧美一级免费播放| 日本美女视频一区二区| 男人操女人下面视频| 99久久99久久久精品齐齐| 在哪里可以看毛片| 亚洲色图欧洲色图婷婷| 国产精品男女视频| 欧美日韩国产欧美日美国产精品| 国产成人毛毛毛片| 亚洲免费电影一区| 久久综合之合合综合久久| 韩国精品久久久999| 国模一区二区| 豆国产97在线| sdde在线播放一区二区| 国产在线无码精品| 久久精品在线| 日本人dh亚洲人ⅹxx| 26uuu久久天堂性欧美| 一级在线观看视频| 午夜精品一区二区三区电影天堂 | 久久久久无码国产精品不卡| 一本色道久久综合亚洲aⅴ蜜桃 | 国产一区二区视频在线| 漂亮人妻被黑人久久精品| 国产精品色一区二区三区| 九九九国产视频| 欧美绝品在线观看成人午夜影视| 欧美性受xxxx狂喷水| 日韩中文字幕精品| xxx欧美xxx| 99久久精品免费看国产四区| 欧美一区二区三| 男女超爽视频免费播放| 国产乱码精品一品二品| 91激情视频在线观看| 亚洲不卡av一区二区三区| 国产一区二区小视频| 亚洲视屏在线播放| av在线中出| 91视频最新| 婷婷激情图片久久| 天天碰免费视频| 91老师国产黑色丝袜在线| 欧美爱爱小视频| 欧美日韩亚洲综合在线| 国内在线免费高清视频| 性视频1819p久久| 亚洲精品黑牛一区二区三区| 一区二区三区四区五区视频 | 午夜视频一区二区三区| 国产免费黄色录像| 神马久久久久久| 国产经典一区| 欧美午夜精品久久久久久蜜| 日韩视频一区| 日本少妇xxxx软件| 夜夜精品视频一区二区| 国产普通话bbwbbwbbw| 日韩中文理论片| 久久xxx视频| 亚洲激情一区二区| 久久精品国产秦先生| 国产又粗又黄又猛| 在线观看www91| seseavlu视频在线| 国产精品久久视频| 成人羞羞在线观看网站| 九九热在线免费| 国产精品麻豆久久久| 在线播放成人av| 色爱av美腿丝袜综合粉嫩av| 国产精品蜜月aⅴ在线| 亚洲成色www久久网站| 麻豆成人免费电影| 五月婷婷综合激情网| 91麻豆精品国产91久久久久久久久| 天堂аⅴ在线地址8| 91香蕉嫩草影院入口| 伊人久久大香线蕉精品组织观看| 91热视频在线观看| 一区二区三区波多野结衣在线观看 | 我和岳m愉情xxxⅹ视频| 在线免费观看一区| 自拍视频在线免费观看| 91视频免费网站| 在线日本成人| 亚洲 小说 欧美 激情 另类| 在线免费观看日本一区| 3d成人动漫在线| 97碰碰视频| 亚洲一区观看| 天天躁夜夜躁狠狠是什么心态| 欧美美女喷水视频| 黄页网站在线| 免费99视频| 久久国产精品免费| 久久久久亚洲av成人片| 日韩精品视频免费| 精品69视频一区二区三区| 黄色网址在线免费看| av成人免费在线观看| 老熟妇一区二区三区啪啪| 另类色图亚洲色图| 岛国成人av| 九色91popny| 一区二区三区久久| 韩国福利在线| 成人欧美视频在线| 日韩av电影一区| 欧美成人片在线观看| 国产丝袜一区二区| 国产999精品在线观看| 日本wwww视频| 亚洲美女视频在线观看| 日本中文字幕一区二区有码在线| 国产中文字幕91| 国产精品日韩久久久|