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