5мес



Программирование
+2Помогите сдать задания Golang
Напишите функцию
Contains(ctx context.Context, r io.Reader, seq []byte) (bool, error)
которая должна найти первое вхождение байт seq в данных, доступных через Reader r. Если последовательность найдена - верните true, nil, иначе false, nil. В случае возникновения ошибки - false и возникшую ошибку. В случае отмены контекста - функция должна вернуть false и ошибку - причину отмены контекста.
По дате
По рейтингу
123456789
func Contains(ctx context.Context,r io.Reader,s []byte)(bool,error){
if len(s)==0{return true,nil}
c:=make(chan struct{d []byte;e error},1)
go func(){c<-struct{d []byte;e error}{io.ReadAll(r)}}()
select{
case <-ctx.Done():return false,ctx.Err()
case r:=<-c:return r.e==nil&&bytes.Contains(r.d,s),r.e
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243
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
}
Больше по теме