Regex 如何在Go中缓存已编译的正则表达式

Regex 如何在Go中缓存已编译的正则表达式,regex,go,compilation,instance-variables,Regex,Go,Compilation,Instance Variables,下面是我的golang代码。每次调用validate方法时,都会执行我的编译方法。我只想编译一次,而不是每次调用validate 1) 怎么做? 2) 我的想法是创建一个实例变量,该变量在开始时为零。它将在validate中延迟初始化 if (a != nil) { a, err := regexp.Compile(rras.Cfg.WhiteList) } 但是如果我将一个变量声明为实例变量 var a *Regexp; // regexp.Compile returns *Regexp

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

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

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 a=regexp.MustCompile(rras.Cfg.WhiteList)
当然,限定类型是
*regexp.regexp
。就像其他类型一样,您必须添加包名。1)正如Peter指出的,类型是
*regexp.regexp
,而不是
*regexp
。2) 如果要延迟初始化已声明的变量,则不要使用
:=
,因为它在当前范围内声明了一个新变量,并且该范围外的旧变量将保持未初始化状态,而应使用
=
仅为已存在的变量赋值。4)正如peterSO所指出的,只需在包级别使用
var a=regexp.MustCompile(…)
在程序启动时初始化变量一次,然后就可以使用它了。这也自动避免了上述数据竞争问题。标准库中的一些示例。