英文:
Go: Global variables
问题
我可以通过在任何函数外部定义对象来轻松地使其成为全局对象,但对于某些必须创建的结构体来说,这种方法不起作用。
我试图做的是一个更复杂的版本:
package main
import "regexp"
func doSomething(test []byte) []byte {
test = reg.ReplaceAll(test,nil)
return test
}
reg, _ := regexp.Compile(`[^a-z\s]`) // 这是问题所在
func main() {
thing := doSomething("somebytes")
}
显然,上述代码是不允许的,但这正是我想要做的。
似乎没有办法在doSomething
函数内部访问reg
对象,而我又不想传递它,因为我将要执行这个操作数十亿次。
如果我将它放在main()
函数中,它就不再是全局的了。我甚至尝试过这样做:
var reg regexp.Regexp
func main() {
reg, _ = regexp.Compile(`[^a-z\s]`)
thing := doSomething("somebytes")
}
...但这也不起作用,它给我一个错误。
有什么想法吗?
更新:我的问题实际上与正则表达式无关,那只是一个例子。
英文:
I can easily make an object global by defining it outside of any function, but this does not work for certain structs that must be created.
What I'm trying to do is a much more complicated version of this:
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")
}
Obviously the above is not allowed, but that's what I'd like to do.
There does not appear to be any way to make that reg
object accessible from within the doSomething
function without passing it, which I want to avoid because I'm going to be doing this several billion times.
If I put it in main()
then it's no longer global. I've even tried this:
var reg regexp.Regexp
func main() {
reg, _ = regexp.Compile(`[^a-z\s]`)
thing := doSomething("somebytes")
}
...but that doesn't work either, it gives me an error.
Any ideas?
Update: My issue is not actually with regexp. That was an example.
答案1
得分: 12
可以这样使用:
var reg = regexp.MustCompile(`[^a-z\s]`) //或者
var reg, _ = regexp.Compile(`[^a-z\s]`) //不过,MustCompile 是更好的选择。
还要记住,`regexp.Compile` / `regexp.MustCompile` 返回一个指针,这就是为什么你的第二次尝试没有成功,你将 `*regexp.Regexp` 赋值给了 `regexp.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() { //初始化全局变量的不同方式
reg2 = regexp.MustCompile(`[^a-z\s]`)
}
func main() {
thing := doSomething([]byte("somebytes"))
fmt.Println(thing)
}
希望对你有帮助!
英文:
It's allowed just fine, you can use:
var reg = regexp.MustCompile(`[^a-z\s]`) //or even
var reg, _ = regexp.Compile(`[^a-z\s]`) // MustCompile is the better choice though.
Also keep in mind that regexp.Compile
/ regexp.MustCompile
returns a pointer, and that's why your 2nd attempt didn't work, you were assigning *regexp.Regexp
to regexp.Regexp
.
Full 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)
}
答案2
得分: 2
短声明语法
reg, _ := regexp.Compile(`[^a-z\s]`)
在全局范围内是不允许的。请明确使用var
代替。
var reg, _ = regex.Compile(`[^a-z\s]`)
英文:
The short declaration syntax
reg, _ := regexp.Compile(`[^a-z\s]`)
is not allowed for global scope. Use var
explicitly instead.
var reg, _ = regex.Compile(`[^a-z\s]`)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论