| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package lststring
- import (
- "fmt"
- "strings"
- "sync"
- )
- /*
- Потокобезопасный компонент списка строк для анализа объектов
- */
- // LstString -- потокобезопасный список строк объекта
- type LstString struct {
- val []string
- strControl string
- block sync.RWMutex
- }
- // NewLstString -- возвращает новый *LstString
- func NewLstString(strControl string) (*LstString, error) {
- if strControl == "" {
- return nil, fmt.Errorf("NewLstString(): strControl is empty")
- }
- sf := &LstString{
- val: make([]string, 0),
- strControl: strControl,
- }
- return sf, nil
- }
- // Get -- возвращает список строк
- func (sf *LstString) Get() []string {
- sf.block.RLock()
- defer sf.block.RUnlock()
- return sf.val
- }
- // Set -- устанавливает список строк
- func (sf *LstString) Set(lstString []string) error {
- sf.block.Lock()
- defer sf.block.Unlock()
- if lstString == nil {
- return fmt.Errorf("LstString.Set(): lstString is nil")
- }
- isOk := false
- for _, strControl := range lstString {
- if strings.Contains(strControl, sf.strControl) {
- isOk = true
- break
- }
- }
- if isOk {
- sf.val = lstString
- return nil
- }
- // Найти заголовок
- var strOut string
- for _, strOut = range lstString {
- if strings.Contains(strOut, "<title>") {
- break
- }
- }
- return fmt.Errorf("LstString.Set(): lstString не имеет правильный title(%q), фактически(%q)", sf.strControl, strOut)
- }
|