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

33 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Домашнее задание №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() должен отрабатывать корректно).