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

在 Go 中对正则表达式进行预编译缓存

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

在 Go 中对正则表达式进行预编译缓存

编程网今天将给大家带来《在 Go 中对正则表达式进行预编译缓存》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

下面是我的 golang 代码。每次调用验证方法时,我的编译方法都会被执行。我只想编译一次,而不是每次调用验证时都编译。

1)如何做? 2)我的想法是创建一个实例变量,该变量在开始时为零。它将在验证中延迟初始化。

if (a != nil) {
  a, err := regexp.compile(rras.cfg.whitelist)
}

但是,如果我将变量声明为实例变量,

var a *regexp; // regexp.compile returns *regexp

我的编译器用红色下划线。如何修复它?

type RRAS struct {
    Cfg       *RRAPIConfig
}

type RRAPIConfig struct {
    WhiteList               string
}

func (rras *RRAS) validate(ctx context.Context) error {
        a, err := regexp.Compile(rras.Cfg.WhiteList)
}


解决方案


静态初始化

var whitelistregexp = regexp.mustcompile(cfg.whitelist)

func (rras *rras) validate(ctx context.context) error {
  if !whitelistregexp.match(...) {...}
}

这将在导入包后立即编译正则表达式,这通常是在程序启动时,在主方法中的任何代码执行之前。

好处

  • 如果正则表达式损坏,您的程序将立即崩溃,这有助于快速找到错误。
  • 代码非常小、干净,没有任何陷阱
  • 无需担心 go 例程

缺点

  • 潜在的缓慢编译可能会减慢整个程序(或服务器)的启动
  • 仅当正则表达式是静态的且在启动时存在时才有效
  • 仅当单个正则表达式(或几个静态正则表达式)用于所有情况时才有效

同步和缓存

var whitelistR struct{
  rex *regexp.Regexp
  once sync.Once
  err error
}

func (rras *RRAS) validate(ctx context.Context) error {
  whitelistR.once.Do(func() {
    whitelistR.ex, whitelistR.err = regexp.Compile(rras.Cfg.WhiteList)
  })

  if whitelistR.err != nil {
    return fmt.Errorf("could not compile regex: %w", err)
  }

  if !whitelistR.rex.Match(...) {...}
}

这将在第一次调用该方法时轻松编译正则表达式。 sync.once 非常重要,因为它是一个同步点,它保证对正则表达式的访问不会出现竞争条件。每次调用该方法都必须等到 regexp 第一次编译。之后同步非常快,因为它仅使用原子加载。

您还可以在主方法中调用一次 go.do(...) 来并行初始化正则表达式,以加快首次调用的速度,而不会阻塞其他方法。

好处

  • 程序(或服务器)启动不受编译时间的影响
  • 仅在实际需要时才进行编译
  • 您可以根据需要动态创建正则表达式的字符串,这可以减少二进制文件大小并加快程序速度
  • 可以在缓存映射中缓存许多不同的正则表达式

缺点

  • 正则表达式中的错误只会在实际使用此方法的测试中显示,而不是在启动时显示
  • 代码更复杂(10 行而不是 1 行)
  • 某些开发人员可能会忘记在另一种方法中调用sync.once,并引入难以捕获的竞争条件
  • 有人可能会尝试巧妙地将sync.once调用包装到if中,并且会引入难以捕获的竞争条件

结论

几乎总是使用简单的静态初始化。仅当您确定对性能有影响(基准测试)时,才使用同步初始化。同步访问时,始终尝试使用 go 提供的帮助程序(sync.once、mutex、rwmutex...),因为它们经过优化且不易出错。

推荐阅读:

The Go Memory Model 有关同步和最佳实践的详细信息

Go Data Race Detector 你应该对每个复杂的多例程围棋程序进行竞赛测试

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~

免责声明:

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

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

在 Go 中对正则表达式进行预编译缓存

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

下载Word文档

猜你喜欢

在 Go 中对正则表达式进行预编译缓存

编程网今天将给大家带来《在 Go 中对正则表达式进行预编译缓存》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!问题内容
在 Go 中对正则表达式进行预编译缓存
2024-04-04

如何在 Golang 中编译正则表达式?

在 golang 中,可以通过以下步骤编译和使用正则表达式:使用 regexp.compile() 编译正则表达式字符串。使用正则表达式值匹配和替换字符串。使用 find()、findindex()、findall()、findallind
如何在 Golang 中编译正则表达式?
2024-05-14

怎么在PHP中对正则表达式进行转义

这篇文章将为大家详细讲解有关怎么在PHP中对正则表达式进行转义,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.语法:string preg_quote ( string $str [, s
2023-06-14

python中怎么对正则表达式re包进行引用

这篇文章主要介绍“python中怎么对正则表达式re包进行引用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么对正则表达式re包进行引用”文章能帮助大家解决问题。对正则表达式re包的
2023-06-29

如何在Java中使用正则表达式对字符串进行判断

如何在Java中使用正则表达式对字符串进行判断?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java 正则表达式判断字符串是否以字符开始:public stat
2023-05-31

如何在Python中使用正则表达式进行模式匹配

正则表达式是一种强大的文本匹配工具,可以在Python中使用re模块来进行模式匹配。以下是使用正则表达式进行模式匹配的一般步骤:
如何在Python中使用正则表达式进行模式匹配
2024-02-22

怎么在java中利用正则表达式对时间日期进行判断

这篇文章给大家介绍怎么在java中利用正则表达式对时间日期进行判断,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现这个功能自然少不了用到正则表达式,提高正则表达式的话,其实它的用法很简单,只需把这个表格记住并且会灵活
2023-05-31

如何在Java中利用正则表达式对电话号码进行获取

这篇文章将为大家详细讲解有关如何在Java中利用正则表达式对电话号码进行获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、正则表达式正则表达式,又称 正规表示法 、 常规表示法 (英语:
2023-05-31

用于捕获 Go 中可选存在的组的正则表达式

php小编百草为您介绍一种用于捕获 Go 中可选存在的组的正则表达式。在Go中,正则表达式是一种强大的工具,可以用来进行字符串匹配和提取。当我们需要匹配一个可选存在的组时,可以使用问号 "?" 来标记这个组的可选性。这种正则表达式的写法简洁
用于捕获 Go 中可选存在的组的正则表达式
2024-02-09

如何在 Go 中为最后一次出现的单个空格编写正则表达式?

问题内容我想用其他内容替换字符串中的最后一个空格。如何在 Golang 中为最后一个空格编写正则表达式?到目前为止我只发现 \s+ 匹配所有空格正确答案您可以使用此正则表达式:\s(\s*)$这匹配一个空白字符,后跟任何非白色字符
如何在 Go 中为最后一次出现的单个空格编写正则表达式?
2024-02-08

编程热搜

  • 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动态编译

目录