我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何访问上下文中的键

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何访问上下文中的键

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何访问上下文中的键》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

第一个例子

我正在使用 chi 路由器 (github.com/go-chi/chi) 和这个简单的默认代码:

586335538​​542

这是我的上下文,如果我 printf 它:

ctx: context.background

.withvalue(&http.contextkey{name:"http-server"}, &http.server{addr:":3000", handler:(*chi.mux)(0xc0002f8840), tlsconfig:(*tls.config)(0xc000430300), readtimeout:0, readheadertimeout:0, writetimeout:0, idletimeout:0, maxheaderbytes:0, tlsnextproto:map[string]func(*http.server, *tls.conn, http.handler){"h2":(func(*http.server, *tls.conn, http.handler))(0x78b450)}, connstate:(func(net.conn, http.connstate))(nil), errorlog:(*log.logger)(nil), disablekeepalives:0, inshutdown:0, nextprotoonce:sync.once{m:sync.mutex{state:0, sema:0x0}, done:0x1}, nextprotoerr:error(nil), mu:sync.mutex{state:0, sema:0x0}, listeners:map[*net.listener]struct {}{(*net.listener)(0xc0001222b0):struct {}{}}, activeconn:map[*http.conn]struct {}{(*http.conn)(0xc000149680):struct {}{}, (*http.conn)(0xc000160460):struct {}{}}, donechan:(chan struct {})(nil), onshutdown:[]func(){(func())(0x7972c0)}})

.withvalue(&http.contextkey{name:"local-addr"}, &net.tcpaddr{ip:net.ip{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, port:3000, zone:""}).withcancel.withcancel

.withvalue(&chi.contextkey{name:"routecontext"}, &chi.context{routes:(*chi.mux)(0xc0002f8840), routepath:"", routemethod:"get", routepatterns:[]string{"/"}, urlparams:chi.routeparams{keys:[]string(nil), values:[]string(nil)}, routepattern:"/", routeparams:chi.routeparams{keys:[]string(nil), values:[]string(nil)}, methodnotallowed:false})

.withvalue("mycontexttestkey", "mycontexttestvalue")

第二个例子

使用 github.com/volatiletech/authboss 我尝试使用以下代码访问上下文:

router.Use(ab.LoadClientStateMiddleware)

router.Group(func(subrouter chi.Router) {
    subrouter.Use(authboss.Middleware2(ab, 1, 1))
    subrouter.Get("/", func(w http.ResponseWriter, r *http.Request) {
        if user := r.Context().Value("user"); user != nil {
            fmt.Println(user.(auth.User))
        } else {
            fmt.Println("Still nil")
        }
    }
}

正如您从这张图片中看到的:

钥匙 user 就在那里。

问题

1) 为什么我无法使用 r.context().value("user") 访问它?为什么总是nil`?

2) 为什么我得到了 routecontextroutecontext 并正确得到了 mycontexttestvaluetest var?

3) 如何读取上下文中的其他键?

注意:我不仅仅使用 chi router 遇到这个问题,我无法理解如何在上下文中访问密钥。我知道我必须在 .value() 中使用相同类型的密钥,但之前如何知道类型?


解决方案


我在不同的库中遇到了同样的问题。同样,我附上了在调试代码时检查 context 的屏幕截图,以表明我们遇到了类似的问题。

请注意,expression 输入框中的 .val 为红色,表示它不是在 context 上定义的属性(即使它存在并且可以通过 .val 访问)。

就像你说的,密钥和属性显然存在,我可以在调试时访问它。但我无法通过代码访问它

我找到了这个article来澄清这个困惑。

本质上,任何时候包处理上下文并向其中添加属性时,该属性的键不应该是字符串,而应该是字符串类型(不导出)。这可以防止与使用上下文的其他包发生密钥冲突。例如,

package some_library
type some_key string
package my_package
type some_key string

两个包之间的 some_key 类型的变量将有所不同。 (更多信息请参见docs)

因此,如果您想实际访问该类型的上下文中的密钥,而不是从包中导入该密钥并使用它来访问上下文中的属性,包将具有一个可以导入的方法,该方法允许您取回财产。这是来自 google.golang.org/grpc/metadata 的一些代码,作为示例,说明如何使用他们提供的 method 访问上下文中的 metadata property:

package metadata

type mdincomingkey struct{}

func fromincomingcontext(ctx context.context) (md md, ok bool) {
    md, ok = ctx.value(mdincomingkey{}).(md)
    return
}

如果您要尝试访问自己的包中的密钥,

package my_package

import "google.golang.org/grpc/metadata"

// yes
md, ok := metadata.FromIncomingContext(ctx)

// no, but will be accessible this way while debugging the code
// md := ctx.Value("key")

// no, but will be accessible this way while debugging the code
// md := ctx.Value("val")

好了,本文到此结束,带大家了解了《如何访问上下文中的键》,希望本文对你有所帮助!关注编程网公众号,给大家分享更多Golang知识!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何访问上下文中的键

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何访问上下文中的键

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何访问上下文中的键》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力
如何访问上下文中的键
2024-04-05

如何访问云服务器上的文件

要访问云服务器上的文件,请按照以下步骤进行操作:连接到云服务器:打开您的Windows操作系统或MacOS操作系统的应用程序商店或服务页面。在此处,您需要找到“设置”应用程序并点击“连接到此计算机”按钮。访问云服务器:使用浏览器访问您的云服务器,您可以使用您常用的云平台和服务,例如AmazonWebServices、GoogleDrive等。点击“连接”按钮以连接到云端。创建数据库:如果
2023-10-26

Linux下如何挂载U盘并访问文件

这篇文章主要为大家展示了“Linux下如何挂载U盘并访问文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何挂载U盘并访问文件”这篇文章吧。挂载 U 盘和挂载光盘的方式是一样的,只
2023-06-27

win10如何下载WindowsApps文件夹访问权限

这篇“win10如何下载WindowsApps文件夹访问权限”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10如何下载
2023-07-01

Lua中如何用table存储和访问键值对

在Lua中,可以使用table来存储和访问键值对。以下是一个示例:-- 创建一个空的tablelocal myTable = {}-- 添加键值对到table中myTable["key1"] = "value1"myTable["k
Lua中如何用table存储和访问键值对
2024-04-10

如何实现在DOS下也能访问网上邻居

这篇文章主要介绍“如何实现在DOS下也能访问网上邻居”,在日常操作中,相信很多人在如何实现在DOS下也能访问网上邻居问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现在DOS下也能访问网上邻居”的疑惑有所
2023-06-09

在linux下如何访问windows的分区

这篇文章主要讲解了“在linux下如何访问windows的分区”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在linux下如何访问windows的分区”吧!新手入门A 在linux下如何访问
2023-06-10

如何访问云主机上的网页

要访问云主机上的网页,您可以执行以下步骤:1. 获取云主机的公网IP地址:登录到云服务提供商的管理控制台,找到您的云主机实例,并获取其公网IP地址。2. 打开浏览器:在您的计算机或移动设备上打开一个支持浏览器。3. 输入IP地址:在浏览器的
2023-08-22

如何处理PHP开发中的文件上传和下载问题

在PHP开发中,文件上传和下载是常见的功能需求。本文将介绍如何处理PHP开发中的文件上传和下载问题,并提供具体的代码示例,帮助读者快速上手。一、文件上传创建上传表单首先,需要在页面上创建一个上传表单,以便用户选择并上传文件。可以使用HTML
2023-10-21

Linux下如何解决SSH拒绝访问的问题

小编给大家分享一下Linux下如何解决SSH拒绝访问的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有时在我们使用 SSH 连接可能会出现Access den
2023-06-28

Flask中的请求上下文和应用上下文对象如何理解

这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求
2023-06-17

如何访问阿里云上的数据库

阿里云数据库提供了多种访问方式,本文将详细介绍如何通过HTTP/HTTPS协议访问阿里云上的数据库。随着互联网的普及和发展,数据的重要性日益凸显。数据的管理和利用是企业运营的核心,因此选择一个稳定、安全、高效的数据库服务尤为重要。阿里云作为国内领先的云计算服务提供商,其数据库服务备受业界推崇。本文将详细介绍如何通
如何访问阿里云上的数据库
2023-11-12

windows中下划线在键盘上如何打出

这篇文章主要介绍了windows中下划线在键盘上如何打出的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows中下划线在键盘上如何打出文章都会有所收获,下面我们一起来看看吧。下划线在键盘上怎么打:答:键盘
2023-07-02

Javascript中的执行上下文如何创建

这篇文章主要介绍“Javascript中的执行上下文如何创建”,在日常操作中,相信很多人在Javascript中的执行上下文如何创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Javascript中的执行上
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录