Реализация слабых ссылок через финализаторы
Добавлено: 25.12.23 14:56
В Golang нет слабых ссылок, но есть финализаторы. Я раньше не знал, что можно выразить первое через второе.
А именно:
* создаём объект
* для него делаем обёртку - "капсулу жизни", ну, или можно назвать яйцом, в котором игла, в которой кощеева смерть.
Это - запись из одного поля, а это поле - наш объект (укль на него)
* у капсулы жизни делаем ещё две обёртки. Одну называем "слабой ссылкой", другую - "сильной ссылкой". Обе обёртки - это записи из одного поля,
а полем является укль на ящик.
* в качестве сильной ссылки передаём "сильную ссылку"
* в качестве слабой ссылки передаём "слабую ссылку"
* любое обращение к методам нашего объекта будет включать два разыменования (за удовольствие надо платить)
* ставим "сильной ссылке" финализатор, который обнуляет укль в капсуле жизни.
Как я понял, в Go это можно сделать через включение структур, при этом двойное разыменование укля будет незаметным. Единственное, не
возможен ли в Go побег указателя на реальный объект через присваивание? Да и в Обероне тот же самый вопрос. Однако, такие случаи мы свалим на программиста, как это принято делать в Си :)
А именно:
* создаём объект
* для него делаем обёртку - "капсулу жизни", ну, или можно назвать яйцом, в котором игла, в которой кощеева смерть.
Это - запись из одного поля, а это поле - наш объект (укль на него)
* у капсулы жизни делаем ещё две обёртки. Одну называем "слабой ссылкой", другую - "сильной ссылкой". Обе обёртки - это записи из одного поля,
а полем является укль на ящик.
* в качестве сильной ссылки передаём "сильную ссылку"
* в качестве слабой ссылки передаём "слабую ссылку"
* любое обращение к методам нашего объекта будет включать два разыменования (за удовольствие надо платить)
* ставим "сильной ссылке" финализатор, который обнуляет укль в капсуле жизни.
Как я понял, в Go это можно сделать через включение структур, при этом двойное разыменование укля будет незаметным. Единственное, не
возможен ли в Go побег указателя на реальный объект через присваивание? Да и в Обероне тот же самый вопрос. Однако, такие случаи мы свалим на программиста, как это принято делать в Си :)