Files
deep_go/homework/03.md
2025-05-23 07:54:04 +03:00

3.1 KiB
Raw Blame History

Домашнее задание №3

📗 В домашнем задании нужно реализовать COW (Copy-On-Write) буффер.

Идея подхода copy-on-write заключается в том, что при чтении данных используется общая копия данных буффера, но в случае изменения данных — создается новая копия данных буффера. Для реализации такого подхода можно использовать разделяемый счетчик ссылок - если при изменении данных буффера кто-то еще ссылается на этот буффер, то нужно будет сначала произвести копию данных буффера, изменить счетчик ссылок и только затем произвести изменение (если никто не ссылается на буффер, то копировать данные буффера не нужно при изменении данных).

Дополнительно еще нужно реализовать метод конвертации данных буффера в строку без копирования и дополнительного выделения памяти.

API для COW буффера будет выглядеть следующим образом:

// Предположим, что все будут производить копирование
// буффера только с использованием метода 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() должен отрабатывать корректно).