123456789101112131415161718192021222324252627282930313233343536373839404142 |
- package mhayaRegex
- import (
- "regexp"
- "sync"
- )
- var (
- regexMu = sync.RWMutex{}
- // Cache for regex object.
- // Note that:
- // 1. It uses sync.RWMutex ensuring the concurrent safety.
- // 2. There's no expiring logic for this map.
- regexMap = make(map[string]*regexp.Regexp)
- )
- // getRegexp returns *regexp.Regexp object with given <pattern>.
- // It uses cache to enhance the performance for compiling regular expression pattern,
- // which means, it will return the same *regexp.Regexp object with the same regular
- // expression pattern.
- //
- // It is concurrent-safe for multiple goroutines.
- func getRegexp(pattern string) (regex *regexp.Regexp, err error) {
- // Retrieve the regular expression object using reading lock.
- regexMu.RLock()
- regex = regexMap[pattern]
- regexMu.RUnlock()
- if regex != nil {
- return
- }
- // If it does not exist in the cache,
- // it compiles the pattern and creates one.
- regex, err = regexp.Compile(pattern)
- if err != nil {
- return
- }
- // Cache the result object using writing lock.
- regexMu.Lock()
- regexMap[pattern] = regex
- regexMu.Unlock()
- return
- }
|