33 lines
3.1 KiB
Markdown
33 lines
3.1 KiB
Markdown
# Домашнее задание №3
|
||
|
||
📗 В домашнем задании нужно реализовать COW (Copy-On-Write) буффер.
|
||
|
||
|
||
Идея подхода copy-on-write заключается в том, что при чтении данных используется общая копия данных буффера, но в случае изменения данных — создается новая копия данных буффера. Для реализации такого подхода можно использовать разделяемый счетчик ссылок - если при изменении данных буффера кто-то еще ссылается на этот буффер, то нужно будет сначала произвести копию данных буффера, изменить счетчик ссылок и только затем произвести изменение (если никто не ссылается на буффер, то копировать данные буффера не нужно при изменении данных).
|
||
|
||
Дополнительно еще нужно реализовать метод конвертации данных буффера в строку без копирования и дополнительного выделения памяти.
|
||
|
||
|
||
|
||
API для COW буффера будет выглядеть следующим образом:
|
||
|
||
|
||
```go
|
||
// Предположим, что все будут производить копирование
|
||
// буффера только с использованием метода Clone()
|
||
type COWBuffer struct { ... }
|
||
|
||
func NewCOWBuffer(data []byte) // создать буффер с определенными данными
|
||
func (b *COWBuffer) Clone() COWBuffer // создать новую копию буфера
|
||
func (b *COWBuffer) Close() // перестать использовать копию буффера
|
||
func (b *COWBuffer) Update(index int, value byte) bool // изменить определенный байт в буффере
|
||
func (b *COWBuffer) String() string // сконвертировать буффер в строку
|
||
```
|
||
|
||
📌 Для выполнения домашнего задания подготовлен шаблон кодаи основные тесты, которую помогут проверить корректность реализации конвертации. Шаблона доступен по ссылке.
|
||
|
||
|
||
|
||
### Задание со звездочкой
|
||
Выполнять необязательно, но если вы уже знакомы c финализатора в Go, то попробуйте реализовать дополнительный вызов метода Close() - на случай того, если вдруг какой-то программист забудет его вызвать явно в коде (в такой реализаци множественный вызов Close() должен отрабатывать корректно).
|