首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go:全局变量

Go:全局变量
EN

Stack Overflow用户
提问于 2014-08-02 15:40:33
回答 2查看 4K关注 0票数 6

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

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

代码语言:javascript
复制
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()中,那么它就不再是全球性的了。我甚至试过这个:

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

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

有什么想法吗?

更新:我的问题其实不是关于regexp的。这就是一个例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-02 15:44:38

很好,你可以用:

代码语言:javascript
复制
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

example

代码语言:javascript
复制
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)
}
票数 12
EN

Stack Overflow用户

发布于 2014-08-02 15:54:27

短声明语法

代码语言:javascript
复制
reg, _ := regexp.Compile(`[^a-z\s]`)

不允许使用全局范围。显式地使用var

代码语言:javascript
复制
var reg, _ = regex.Compile(`[^a-z\s]`)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25096688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档