精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

黑人性生活视频| 国产精品中文欧美| 国产亚洲一区二区三区在线观看 | 欧美黄色小视频| 欧美三级电影在线播放| 久热精品在线观看| 日本一二三四区视频| 亚洲色偷偷综合亚洲av伊人| 欧美日韩精品免费观看视完整| 激情都市一区二区| 在线成人激情黄色| 午夜视频在线瓜伦| 噜噜噜在线观看播放视频| 国产精品一区免费在线| 国产精品日韩精品欧美在线| 国产精品久久久久久久av电影| 在线观看国产免费视频| 九色porny自拍视频在线观看| 国产激情91久久精品导航| www.亚洲天堂| 在线免费观看av网| 天天综合网天天| 国产亚洲欧美激情| 国产精品xxxx| www.av视频在线观看| 一区二区亚洲视频| 无吗不卡中文字幕| 麻豆av一区二区三区| 亚洲欧美一二三区| av亚洲在线观看| 91九色国产在线播放| 亚洲影视一区| 欧美一区二区三区视频在线观看 | 婷婷中文字幕在线观看| 无码小电影在线观看网站免费| 成人深夜在线观看| 国内伊人久久久久久网站视频| 久久久高清视频| 欧美男人天堂| 夜夜夜精品看看| 国产精品视频免费观看| 国产成人一级片| 精品国产乱码久久久久久果冻传媒| 欧美一区二区三区免费大片 | 激情综合网av| 国产精品小说在线| 很污很黄的网站| 国产区一区二| 欧美日韩国产一级| www.国产在线播放| 欧美美乳在线| 97精品国产露脸对白| 国产精品黄页免费高清在线观看| 日韩精品一卡二卡| 日韩一区电影| 精品处破学生在线二十三| 国产精品亚洲αv天堂无码| 在线观看二区| 久久丁香综合五月国产三级网站| 欧美成人免费在线视频| 国产福利短视频| 羞羞影院欧美| 91国偷自产一区二区三区观看| 亚洲免费在线精品一区| 国产 日韩 欧美 综合| 久久久久久9| 欧美日韩ab片| 日本免费www| 国产精品久久久网站| 欧美亚洲一区二区三区四区| 黄色三级中文字幕| 国产三级电影在线| 成人h动漫精品一区二区| 国产福利视频一区二区| 久久久久久久久精| 亚洲高清激情| 久久影视电视剧免费网站| 国产ts丝袜人妖系列视频 | 精品捆绑调教一区二区三区| 国产午夜精品久久久久久久 | 成人av在线网址| 六月丁香在线视频| 欧美精品国产一区| 丝袜亚洲欧美日韩综合| 美女被到爽高潮视频| 国产精品男女| 亚洲欧美日韩网| 日本国产在线视频| 欧美精选一区二区三区| 久久精品视频在线| 久久久国产一级片| 九色成人国产蝌蚪91| 欧美精品一区二区精品网| a视频免费观看| 97精品97| 久久精品国产69国产精品亚洲| 高h视频免费观看| 日韩精品免费一区二区在线观看| 久热国产精品视频| 国产成人在线免费视频| 久久精品国产一区二区三| 国产成人免费av| 国产一区二区在线播放视频| 青青青伊人色综合久久| 国产91精品在线播放| 国产毛片aaa| 麻豆成人综合网| 国产伦一区二区三区色一情| 日本中文在线观看| 黄网动漫久久久| 手机在线视频一区| 最近国产精品视频| 欧美激情久久久| 136福利视频导航| 久久久亚洲精品一区二区三区| 久久成人资源| 日本福利在线观看| 26uuu色噜噜精品一区二区| 精品国产一区二区三区日日嗨| 欧美一级在线免费观看| 99久久精品免费| 懂色av粉嫩av蜜臀av| 18+激情视频在线| 樱花草国产18久久久久| 妞干网视频在线观看| 国产精品久久乐| 678五月天丁香亚洲综合网| 男女视频在线看| 88xx成人永久免费观看| 亚洲国产成人精品电影| 丰满少妇在线观看资源站| 欧美激情第8页| 777国产偷窥盗摄精品视频| 国产99久久久| 国产.精品.日韩.另类.中文.在线.播放| caoporen国产精品| 日本国产在线| 婷婷久久综合九色综合绿巨人 | 色av中文字幕一区| www.av88| 国产精品白丝av| 一卡二卡3卡四卡高清精品视频| 国产超级va在线视频| 亚洲大片一区二区三区| 国产三级日本三级在线播放| 亚州av日韩av| 久久精品视频免费播放| 亚洲影院一区二区三区| 成人污视频在线观看| 国产91视频一区| 国产精品迅雷| 91精品国产福利| 久久福利免费视频| 亚洲麻豆av| 国产主播在线一区| 朝桐光av在线一区二区三区| 久久蜜臀中文字幕| 大地资源网在线观看免费官网| 夜鲁夜鲁夜鲁视频在线播放| 亚洲国产精品久久精品怡红院| 国产精品99精品| caoporm超碰国产精品| 香蕉久久夜色| sm捆绑调教国产免费网站在线观看| 欧美成人乱码一区二区三区| 精品人妻一区二区三区蜜桃视频| 久久久久久穴| 性欧美.com| 国产精品视频首页| 欧美精品videossex性护士| 亚洲精品91天天久久人人| 欧美激情一区不卡| 成年网站在线免费观看| 欧美日韩播放| 国产欧美日韩91| av毛片在线看| 日韩电影网在线| 激情四射综合网| 久久99久国产精品黄毛片色诱| 在线视频福利一区| 欧美黑人巨大xxxxx| 在线观看国产精品日韩av| 国产精品久久久久久在线| 久久久久久久久久看片| 黄大色黄女片18第一次| 欧美三区视频| 欧美精品尤物在线| 日韩免费在线电影| 在线观看亚洲视频| 国产欧美综合视频| 国产精品电影一区二区三区| 激情网站五月天| 久久99偷拍| 久久久久久久久久久免费| 天堂影院在线| 精品久久久久久久久久久久| 亚洲色图第四色| 高清shemale亚洲人妖| 黄色高清无遮挡| 欧美99在线视频观看| 日韩不卡av| 日韩av电影资源网| 亚洲日韩欧美视频| 欧美一区二区三区久久久| 亚洲色图20p| 日本中文字幕在线不卡| 中文精品久久| 欧美日韩一区在线观看视频| 国产精品白丝久久av网站| 欧美一级淫片丝袜脚交| 天天干天天色天天| 欧美日韩免费看| 泷泽萝拉在线播放| 国产精品91一区二区| www黄色在线| 99精品免费| 青青草久久网络| 全球最大av网站久久| 欧美精品久久久久久久免费观看| 自拍视频在线网| 亚洲欧美日韩国产中文| 天堂在线视频免费| 欧美大片在线观看一区| 一级aaa毛片| 亚洲天堂成人网| 中文字幕在线观看二区| 国产午夜亚洲精品不卡| 国产视频久久久久久| 久久综合婷婷| 一本色道婷婷久久欧美| 美女久久99| 精品国产中文字幕| 国产成人高清精品免费5388| 96sao精品视频在线观看| av白虎一区| 欧美成人性色生活仑片| 久久77777| 亚洲精品98久久久久久中文字幕| 人人草在线观看| 午夜精品在线看| 国产91丝袜美女在线播放| 91在线观看污| 国产草草浮力影院| 91香蕉视频污在线| av网站免费在线播放| 91网页版在线| 精品无码一区二区三区| 精品一区二区三区免费视频| 97公开免费视频| 日韩国产精品久久久| 特色特色大片在线| 亚洲精品二区三区| 女女同性女同一区二区三区91| 久久99精品国产自在现线| 久久99精品久久久久久水蜜桃| 国产精品自在| 欧美日韩在线高清| 欧美精选一区二区三区| 综合国产精品久久久| 一区二区三区在线观看免费| 日本精品福利视频| 精品福利电影| 欧美激情成人网| 久久国产三级精品| 能看毛片的网站| 99精品在线免费| 亚洲国产av一区| 国产精品成人免费在线| 我家有个日本女人| 亚洲成人在线网站| 无码免费一区二区三区| 欧美久久免费观看| 无码人妻精品一区二区蜜桃色欲 | 亚洲国产精品二十页| 成年女人免费视频| 国产在线国偷精品免费看| 成人一级片网站| 理论片日本一区| 日本少妇xxxx软件| 国产美女精品人人做人人爽| 性折磨bdsm欧美激情另类| av一区二区久久| 美国美女黄色片| 亚洲精品高清在线| 日韩久久中文字幕| 69久久夜色精品国产69蝌蚪网| www.天天干.com| 亚洲天堂日韩电影| 日本午夜在线视频| 日韩网站在线观看| 国产拍在线视频| 国产精品美乳一区二区免费| 成年美女黄网站色大片不卡| 国产有码一区二区| 欧美亚洲tv| 精品国产乱码久久久久久蜜柚 | 91麻豆精品在线观看| 国精产品视频一二二区| 午夜激情一区二区三区| 91亚洲精品国偷拍自产在线观看| 亚洲国产精品电影| 成人在线播放| 日韩av理论片| 大伊香蕉精品在线品播放| 日韩中文一区| 在线看片一区| 色欲无码人妻久久精品| 中文字幕欧美日本乱码一线二线| 国产午夜免费视频| 91精品中文字幕一区二区三区| 四虎成人免费在线| 欧美国产视频一区二区| 成人黄色在线| 国产日韩欧美成人| 日韩精品丝袜美腿| 成人国产一区二区三区| 麻豆91精品视频| 国产三级av在线播放| 亚洲一级片在线观看| 日韩无码精品一区二区三区| 婷婷开心激情综合| 午夜精品久久久久久久99老熟妇| 国产一区二区三区在线视频| sm捆绑调教国产免费网站在线观看| 成人在线免费观看视视频| 精品大片一区二区| 欧美一级在线看| 蜜桃视频第一区免费观看| 伊人成人222| 福利电影一区二区| 97在线观看免费高| 欧美日韩精品三区| av大片在线看| 国产精品久久二区| 色综合综合色| 中文字幕无码不卡免费视频| 97久久人人超碰| 日韩欧美一级视频| 亚洲乱码av中文一区二区| 一区二区乱码| 欧美在线激情| 日韩av一区二区在线影视| 精品无码人妻一区| 色素色在线综合| 激情视频在线观看免费| 操人视频在线观看欧美| **国产精品| 久久综合给合久久狠狠色| 日韩午夜av在线| 黄色国产在线观看| 色综合一个色综合亚洲| 国产成人精品一区二区无码呦| 亚洲风情亚aⅴ在线发布| 123区在线| 久久涩涩网站| 日韩中文字幕区一区有砖一区 | 天美一区二区三区| 一区二区高清免费观看影视大全| 亚洲爱情岛论坛永久| 亚洲视频网站在线观看| 日本欧美不卡| 在线视频不卡一区二区| 国产黄人亚洲片| 国产精品成人国产乱| 日韩av在线一区| 二吊插入一穴一区二区| 亚洲欧美日韩国产成人综合一二三区 | 日韩在线中文视频| 国产日韩中文在线中文字幕| 欧洲精品在线播放| 久久久噜噜噜久噜久久综合| 国产精品xxxxxx| 操91在线视频| 日本在线中文字幕一区| 黑人粗进入欧美aaaaa| 国产suv精品一区二区883| 久久精品视频9| 亚洲色在线视频| 成人午夜888| 无罩大乳的熟妇正在播放| 久久精品亚洲一区二区三区浴池| 在线观看xxxx| 久久久亚洲网站| 欧美丝袜丝交足nylons172| 久久久999免费视频| 久久精品无码一区二区三区| 国产一区二区麻豆| 欧美亚洲视频在线观看| 久久高清精品| 白嫩情侣偷拍呻吟刺激| 欧美在线色视频| 国模吧精品人体gogo| 91久久国产综合久久91精品网站| 精品免费一区二区| 香蕉视频色在线观看| 欧美日韩中文在线| 日本亚洲一区| 91偷拍精品一区二区三区| 亚洲国产精品成人| 91视频啊啊啊|