我可以通过在任何函数之外定义对象来轻松地创建对象,但是这对于必须创建的某些结构不起作用。
我正在尝试做的是一个更为复杂的版本:
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}}
...但这也不起作用,它给了我一个错误。
有什么想法吗?
更新:我的问题实际上不是正则表达式。那就是一个例子。
答案 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]`)