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, "") { break } } return fmt.Errorf("LstString.Set(): lstString не имеет правильный title(%q), фактически(%q)", sf.strControl, strOut) }