返回顶部
首页 > 资讯 > 后端开发 > GO >如何访问上下文中的键
  • 247
分享到

如何访问上下文中的键

2024-04-05 00:04:22 247人浏览 八月长安
摘要

golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何访问上下文中的键》带大家来了解一下##content_title##,希望对大家的

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知识!

您可能感兴趣的文档:

--结束END--

本文标题: 如何访问上下文中的键

本文链接: https://www.lsjlt.com/news/596576.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何访问上下文中的键
    Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何访问上下文中的键》带大家来了解一下##content_title##,希望对大家的...
    99+
    2024-04-05
  • 如何访问云服务器上的文件
    要访问云服务器上的文件,请按照以下步骤进行操作: 连接到云服务器:打开您的 Windows 操作系统或 MacOS 操作系统的应用程序商店或服务页面。在此处,您需要找到“设置”应用程序并点击“连接到此计算机”按钮。 访问云服务器:使用浏...
    99+
    2023-10-26
    器上 文件
  • 学习笔记:如何用 Python 访问文件中的关键字?
    Python 是一种广泛使用的编程语言,它有很多功能强大的特性。其中,Python 读取和处理文件的能力是非常出色的。在本篇文章中,我们将介绍如何使用 Python 访问文件中的关键字。 打开文件 在 Python 中,使用 open...
    99+
    2023-11-14
    文件 学习笔记 关键字
  • Linux下如何挂载U盘并访问文件
    这篇文章主要为大家展示了“Linux下如何挂载U盘并访问文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何挂载U盘并访问文件”这篇文章吧。挂载 U 盘和挂载光盘的方式是一样的,只...
    99+
    2023-06-27
  • Windows下如何使用PHP访问文件路径?
    当我们在Windows下使用PHP时,经常需要访问文件路径,这是一个非常常见的需求。在本文中,我们将介绍如何使用PHP访问文件路径。 首先,我们需要知道Windows下文件路径的格式。Windows下的文件路径格式是以盘符开头,例如C:Wi...
    99+
    2023-07-01
    path windows shell
  • win10如何下载WindowsApps文件夹访问权限
    这篇“win10如何下载WindowsApps文件夹访问权限”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10如何下载...
    99+
    2023-07-01
  • 如何实现在DOS下也能访问网上邻居
    这篇文章主要介绍“如何实现在DOS下也能访问网上邻居”,在日常操作中,相信很多人在如何实现在DOS下也能访问网上邻居问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现在DOS下也能访问网上邻居”的疑惑有所...
    99+
    2023-06-09
  • Flask中的请求上下文和应用上下文对象如何理解
    这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求...
    99+
    2023-06-17
  • window下如何远程访问redis
    window下远程访问redis的方法:在redis的安装目录下打卡命令行模式。也可以在Windows桌面使用快捷键WIN+R打开命令行模式,再切换到redis的安装目录下。在命令行模式下,输入以下命令进行远程访问。//命令语法redis-...
    99+
    2024-04-02
  • Linux下如何加速访问github
    这篇文章主要介绍Linux下如何加速访问github,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!\1. 登录http://tool.chinaz.com/dns/\2. 查询以下域名映射,并分别取访问速度较快的一个...
    99+
    2023-06-28
  • 如何监控cdn上的页面访问
    监控cdn上的页面访问示例:邮件脚本如下:#!/usr/bin/python#coding:utf-8import smtplibfrom email.mine.text import MIMETex...
    99+
    2024-04-02
  • 如何访问云主机上的网页
    要访问云主机上的网页,您可以执行以下步骤:1. 获取云主机的公网IP地址:登录到云服务提供商的管理控制台,找到您的云主机实例,并获取...
    99+
    2023-08-22
    云主机
  • 在linux下如何访问windows的分区
    这篇文章主要讲解了“在linux下如何访问windows的分区”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在linux下如何访问windows的分区”吧!新手入门A 在linux下如何访问...
    99+
    2023-06-10
  • 如何解决IE下AjaxSubmit上传文件提示下载文件的问题
    小编给大家分享一下如何解决IE下AjaxSubmit上传文件提示下载文件的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sp...
    99+
    2024-04-02
  • Lua中如何用table存储和访问键值对
    在Lua中,可以使用table来存储和访问键值对。以下是一个示例: -- 创建一个空的table local myTable = {...
    99+
    2024-04-10
    Lua
  • 如何处理PHP开发中的文件上传和下载问题
    在PHP开发中,文件上传和下载是常见的功能需求。本文将介绍如何处理PHP开发中的文件上传和下载问题,并提供具体的代码示例,帮助读者快速上手。一、文件上传创建上传表单首先,需要在页面上创建一个上传表单,以便用户选择并上传文件。可以使用HTML...
    99+
    2023-10-21
    文件上传 文件下载 PHP开发
  • windows中下划线在键盘上如何打出
    这篇文章主要介绍了windows中下划线在键盘上如何打出的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows中下划线在键盘上如何打出文章都会有所收获,下面我们一起来看看吧。下划线在键盘上怎么打:答:键盘...
    99+
    2023-07-02
  • Javascript中的执行上下文如何创建
    这篇文章主要介绍“Javascript中的执行上下文如何创建”,在日常操作中,相信很多人在Javascript中的执行上下文如何创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Javascript中的执行上...
    99+
    2023-07-05
  • Linux下如何解决SSH拒绝访问的问题
    小编给大家分享一下Linux下如何解决SSH拒绝访问的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有时在我们使用 SSH 连接可能会出现Access den...
    99+
    2023-06-28
  • 如何访问阿里云上的数据库
    阿里云数据库提供了多种访问方式,本文将详细介绍如何通过HTTP/HTTPS协议访问阿里云上的数据库。 随着互联网的普及和发展,数据的重要性日益凸显。数据的管理和利用是企业运营的核心,因此选择一个稳定、安全、高效的数据库服务尤为重要。阿里云作...
    99+
    2023-11-12
    阿里 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作