当前位置: 首页>关注 >
Go-标准库-context(二)
2023-04-27 10:31:36 来源:腾讯云
(资料图)
传递值
除了用于传递取消信号外,context还可以用于传递请求范围的值。可以通过context.WithValue函数将一个值保存到context中,然后在需要的地方通过context.Value函数获取该值。
下面是一个使用context传递请求范围的值的示例程序::
package mainimport ("context""fmt")type key intconst (nameKey key = iotaageKey)func main() {ctx := context.WithValue(context.Background(), nameKey, "Alice")ctx = context.WithValue(ctx, ageKey, 20)name, ok := ctx.Value(nameKey).(string)if !ok {fmt.Println("name not found")return}age, ok := ctx.Value(ageKey).(int)if !ok {fmt.Println("age not found")return}fmt.Printf("name: %s\n", name)fmt.Printf("age: %d\n", age)}
在这个示例程序中,我们通过context.WithValue函数将一个名为"name"的字符串和一个年龄为20的整数保存到context中。然后,我们分别通过context.Value函数获取这两个值,并将它们转换为相应的类型。最后,我们输出这两个值。
需要注意的是,使用context传递请求范围的值并不是一个好的设计,因为这样会让程序变得复杂,而且容易出错。如果需要在多个goroutine之间共享数据,应该使用同步原语(例如mutex或channel)来保证数据的安全性。
实际应用
context包被广泛用于Go中的网络编程和多线程编程中。在网络编程中,可以使用context包来传递请求的截止时间和取消信号,以便控制网络连接的超时和关闭。在多线程编程中,可以使用context包来控制多个goroutine之间的交互,避免出现竞争条件和死锁等问题。
下面是一个使用context包进行网络编程的示例程序:
package mainimport ("context""fmt""io/ioutil""net/http""time")func main() {ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel()req, err := http.NewRequest("GET", "https://www.google.com", nil)if err != nil {fmt.Println("http.NewRequest error:", err)return}req = req.WithContext(ctx)client := http.DefaultClientresp, err := client.Do(req)if err != nil {fmt.Println("client.Do error:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("ioutil.ReadAll error:", err)return}fmt.Println(string(body))}
在这个示例程序中,我们创建了一个带有2秒超时的Cancel context,并将其作为请求的Context。然后,我们使用http.NewRequest函数创建了一个GET请求,并将请求的Context设置为上面创建的Cancel context。最后,我们使用http.DefaultClient执行请求,并读取响应的内容。
需要注意的是,在网络编程中,要注意合理设置请求的超时时间,避免请求超时或一直等待的情况发生。
关键词:
为你推荐
-
Go-标准库-context(二)
-
这个活动,要和你聊聊版权那些事~
-
兰卫医学4月27日快速反弹|世界信息
-
苏州哪个医院肛肠科较好 苏州东吴医院靠谱吗_今日热文
-
孙堂村 环球速讯
-
央行公开市场操作净投放量630亿元,国债期货全线收涨|债市纵览
-
五部门:切实做好网约车聚合平台规范管理有关工作 报资讯
-
法媒:农村医疗条件落后,法国城乡居民寿命差距在拉大_环球聚焦
-
汐泰投资旗下4只基金年内均跌 成立来最大跌幅达32%_环球观天下
-
ppm在气体中的单位_气体ppm是什么单位 焦点热议
-
国产新型离子膜问世 将推动我国实现“双碳”目标|世界新资讯
-
乌鲁卡基那改革_乌鲁卡
-
世界百事通!c30混凝土强度变化时间表_c30混凝土强度是多少
-
全球时讯:国能日新将于5月4日解禁2785.23万股
-
“大专毕业,长相白净,身高中等”,农村男青年为何成为婚恋“出局者”_世界看热讯
-
世界要闻:如何给漆上色
-
5个月幼儿患病急需身份证,民警4天加急办好|全球热推荐
-
快讯 | 红豆股份2023年一季度营收增长1.79%至6.55亿元
-
环球新消息丨上海金山这个古镇上线“元宇宙”平台,创新重现那些历史遗迹和场景
-
山西省晋兴创业有限公司_焦点报道
推荐内容
- Go-标准库-context(二)
- 这个活动,要和你聊聊版权那些事~
- 兰卫医学4月27日快速反弹|世界信息
- 苏州哪个医院肛肠科较好 苏州东吴医院靠谱吗_今
- 孙堂村 环球速讯
- 央行公开市场操作净投放量630亿元,国债期货全线
- 五部门:切实做好网约车聚合平台规范管理有关工作
- 法媒:农村医疗条件落后,法国城乡居民寿命差距在
- 汐泰投资旗下4只基金年内均跌 成立来最大跌幅达3
- ppm在气体中的单位_气体ppm是什么单位 焦点热议
- 国产新型离子膜问世 将推动我国实现“双碳”目标
- 乌鲁卡基那改革_乌鲁卡
- 世界百事通!c30混凝土强度变化时间表_c30混凝土
- 全球时讯:国能日新将于5月4日解禁2785.23万股
- “大专毕业,长相白净,身高中等”,农村男青年为
- 世界要闻:如何给漆上色
- 5个月幼儿患病急需身份证,民警4天加急办好|全球
- 快讯 | 红豆股份2023年一季度营收增长1.79%至6.55亿元
- 环球新消息丨上海金山这个古镇上线“元宇宙”平台
- 山西省晋兴创业有限公司_焦点报道
- 当前简讯:瑞典央行加息,为何瑞典克朗反而跳水
- 微动态丨单枞茶读音是什么_单枞茶的特点
- 湖北广电:中标湖北广播电视台7486万元采购项目
- 美国3月楼市量价齐跌,释放什么信号?分析师这么说
- 新动态:地大团队研究“祝融号”数据找到火星近期
- 【全球快播报】中旅集团挂牌转让港中旅国际成都公
- 美洲大鲵开始频繁捕食其幼崽,怎么回事?森林砍伐
- 伪造“代购”全套票据及物流信息 厦门海关查获案
- 天天通讯!长江师范学院是几本_长江师范学院是多
- 世界信息:2023年4月26日山东省醋酸乙酯价格最新行
- 市场监管总局:直播带货等新业态要在规范中发展
- 在东非高原上打造“美丽工程”
- 环球热头条丨中超第3轮第2个比赛日裁判安排:共踢
- 今年重庆市所有基层医疗机构将设中医馆
- 国家能源集团常州2×100万千瓦机组扩建项目相关的
- 我敬佩的好友宋遂良|世界即时看
- 视点丨外资金融机构布局中国财富管理市场
- 横店影视两任财务总监潘锋沈俊玲被警示 更正会计
- 焦点日报:万达地产集团成老赖被强执超10亿
- 焦点速看:名落孙山文言文翻译50字_名落孙山文言
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市