0%

go正则的坑

前言

为啥会有这篇博客呢,因为我在一个坑里面掉了两次…

这两周在实习,还算是适应,体会就是自己真的太菜了….大佬云集

特别是源码的升级和追踪方面,记录一下第二次遇到这个问题

mentor跟我说的时候这是血的教训,跑服务的时候跑着跑着内存炸了,最后发现是正则的问题

案例

正常使用正则的例子,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"regexp"
)

func main() {

r, _ := regexp.Compile("p([a-z]+)ch")

fmt.Println(r.MatchString("peach"))

}

因为立马main函数就结束了,释放了这个go进程,但是如果一直循环调用这个正则,比如循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"fmt"
"regexp"
)

func main() {
for i:=0;i<1000;i++{
r, _ := regexp.Compile("p([a-z]+)ch")
fmt.Println(r.MatchString("peach"))
}

}

在for循环中不断的正则Compile就会不断对r进行赋值,但是go不会对之前的新建内存进行gc…然后就不断累加内存最后炸了…

也就是传说中的,内存泄漏

解决方案

所以如果要被多次调用正则的时候,需要将这个正则表达式模式提出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"regexp"
)

//作为全局变量提出,不会每次进行初始化占用内存
r, _ := regexp.Compile("p([a-z]+)ch")

func main() {
for i:=0;i<1000;i++{
fmt.Println(r.MatchString("peach"))
}

}

结论

过一过二不过三…