Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Помогите сдать задания Golang

Напишите функцию

Contains(ctx context.Context, r io.Reader, seq []byte) (bool, error)

которая должна найти первое вхождение байт seq в данных, доступных через Reader r. Если последовательность найдена - верните true, nil, иначе false, nil. В случае возникновения ошибки - false и возникшую ошибку. В случае отмены контекста - функция должна вернуть false и ошибку - причину отмены контекста.

По дате
По рейтингу
Аватар пользователя
Мыслитель
5мес
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 
	} 
} 
Аватар пользователя
Оракул
5мес
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 
}