传递给 regexp.FindStringSubmatch 的字符串内存是否与返回切片中的字符串共享?
在
src/regexp/regexp.go
第1044~1057行,该函数创建一个切片,其元素是原始字符串的切片。而 go 中的 slice 只是对一系列数据的引用,因此 ret
实际上与原始 s
共享内存。
func (re *Regexp) FindStringSubmatch(s string) []string {
var dstCap [4]int
a := re.doExecute(nil, nil, s, 0, re.prog.NumCap, dstCap[:0])
if a == nil {
return nil
}
ret := make([]string, 1+re.numSubexp)
for i := range ret {
if 2*i < len(a) && a[2*i] >= 0 {
ret[i] = s[a[2*i]:a[2*i+1]]
}
}
return ret
}
但是,字符串在 golang 中是不可变的,因此该函数不会导致问题。