Go:全局变量

时间:2014-08-02 15:40:33

标签: 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")
}

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

似乎没有任何方法可以在reg函数中从doSomething函数中访问main()对象而不传递它,我想避免这样做,因为我将要做几十亿次。

如果我把它放在var reg regexp.Regexp func main() { reg, _ = regexp.Compile(`[^a-z\s]`) thing := doSomething("somebytes") } 中,那么它就不再是全球性的了。我甚至试过这个:

{{1}}

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

有什么想法吗?

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

2 个答案:

答案 0 :(得分:10)

允许就好了,你可以使用:

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.Regexp分配给regexp.Regexp。< / p>

完整example

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)
}

答案 1 :(得分:2)

简短声明语法

reg, _ := regexp.Compile(`[^a-z\s]`)
全局范围不允许

。请明确使用var

var reg, _ = regex.Compile(`[^a-z\s]`)