package main
import (
"bytes"
"context"
"io"
)
func Contains(ctx context.Context, r io.Reader, seq []byte) (bool, error) {
if len(seq) == 0 {
return true, nil
}
bufSize := 4096
buf := make([]byte, bufSize)
var prev []byte
for {
select {
case <-ctx.Done():
return false, ctx.Err()
default:
}
n, err := r.Read(buf)
if n > 0 {
data := append(prev, buf[:n]...)
if bytes.Index(data, seq) >= 0 {
return true, nil
}
if len(data) >= len(seq)-1 {
prev = data[len(data)-len(seq)+1:]
} else {
prev = data
}
}
if err != nil {
if err == io.EOF {
break
}
return false, err
}
}
return false, nil
}
Contains(ctx context.Context, r io.Reader, seq []byte) (bool, error)
которая должна найти первое вхождение байт seq в данных, доступных через Reader r. Если последовательность найдена - верните true, nil, иначе false, nil. В случае возникновения ошибки - false и возникшую ошибку. В случае отмены контекста - функция должна вернуть false и ошибку - причину отмены контекста.