Skip to content

Удаление Post

Итак, мы хотим, чтобы пользователи нашего Feed могли удалять свои сообщения. Как это можно смоделировать? Если бы наш Feed был массивом, мы бы просто удалили элемент и покончили с этим, верно?

Что ж, на самом деле именно здесь связанные списки проявляют себя. Когда размеры массивов изменяются, среда выполнения должна захватывать новый блок памяти для хранения элементов массива. Связанные списки из-за своей структуры, при которой каждый элемент имеет указатель на следующий узел в списке, могут быть разбросаны по всему пространству памяти. Это означает, что добавление или удаление узлов из связанного списка дешево с точки зрения пространства. Когда кто-то хочет удалить узел, связаны должны быть только соседи удаленного узла. Языки со сборщиком мусора (такие как Go) делают это еще проще, поскольку нам не нужно беспокоиться об освобождении выделенной памяти — сборщик мусора включится и удалит все неиспользуемые объекты.

Чтобы немного облегчить нам жизнь в этом примере, давайте наложим ограничение, согласно которому в Feed каждый из элементов Post будет иметь уникальный publishDate. Это означает, что издатель может создавать один элемент Post в секунду в своем Feed. Принимая это во внимание, вот как мы можем легко удалить Post из Feed:

Функция Remove примет publishDate из Post в качестве аргумента, с помощью которого она определит, какой Post нужно удалить (или связь с каким Post нужно отменить). Функция довольно маленькая. Если она обнаружит, что элемент start Feed должен быть удален, то просто переназначит его start Feed второму элементу Post в Feed. В противном случае она перескакивает через каждый из Post’ов в Feed, пока не наткнется на Post, который соответствует тому publishDate, который был передан в качестве аргумента функции. Когда функция найдет и удалит нужный Post, она просто соединит предыдущий и следующий Post’ы.

Есть один случай, в котором нам нужно убедиться, что мы покрываем нашу функцию Remove: что если у Feed нет Post с указанным publishDate? Для простоты функция проверяет отсутствие элемента next Post в Feed перед переходом к нему. Если next это nil, то вызовется panic, сообщающая нам, что она не может найти Post с таким publishDate.