执行:全局变量

阿拉斯代尔

我可以通过在任何函数之外定义对象来轻松地使它成为全局对象,但这不适用于必须创建的某些结构。

我想要做的是一个更复杂的版本:

package main
import "regexp"

func doSomething(test []byte) []byte {
   test = reg.ReplaceAll(test,nil)
   return test
}

reg, _ := regexp.Compile(`[^a-z\s]`) // this is the issue

func main() {
   thing := doSomething("somebytes")
}

显然,以上内容是不允许的,但这就是我想要做的。

似乎没有任何方法reg可以在doSomething不传递对象的情况下函数内部对其进行访问,我想避免这种方法,因为我将这样做数十亿次。

如果我把它放进去,main()那么它将不再是全球性的。我什至尝试过:

var reg regexp.Regexp
func main() {
   reg, _ = regexp.Compile(`[^a-z\s]`)
   thing := doSomething("somebytes")
}

...但是那也不起作用,这给了我一个错误。

有任何想法吗?

更新:我的问题实际上不是正则表达式。那是一个例子。

一对一

允许就可以了,您可以使用:

var reg = regexp.MustCompile(`[^a-z\s]`) //or even
var reg, _ = regexp.Compile(`[^a-z\s]`) // MustCompile is the better choice though.

另外请记住,regexp.Compile/regexp.MustCompile返回一个指针,这就是为什么您第二次尝试不起作用的原因,而您分配*regexp.Regexpregexp.Regexp

完整示例

func doSomething(test []byte) []byte {
    test = reg.ReplaceAll(test, nil)
    return test
}

var (
    reg, _ = regexp.Compile(`[^a-z\s]`)
    reg2   *regexp.Regexp
)

func init() { //different way of initializing global valuables
    reg2 = regexp.MustCompile(`[^a-z\s]`)
}

func main() {
    thing := doSomething([]byte("somebytes"))
    fmt.Println(thing)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章