Go:全局变量

Ala*_*air 5 go

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

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

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")
}
Run Code Online (Sandbox Code Playgroud)

显然上面是不允许的,但这就是我想做的事情.

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

如果我把它放进去,main()它就不再是全球性的了.我甚至试过这个:

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

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

有任何想法吗?

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

One*_*One 10

它允许很好,你可以使用:

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

还要记住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)
}
Run Code Online (Sandbox Code Playgroud)