// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package gregex 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 . // 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 }