hikan.ru/posts/unsafe-change-string-go.md

1.5 KiB
Raw Blame History

Как же все таки изменить байты строки в Go?

Просто захотелось чуть чуть поиграться с пакетом unsafe в Go.

Строки (тип string) в Go являются immutable, то есть изменять их нельзя. Ну вообще конечно можно, но не напрямую.

Строка в Go под капотом является структурой вида: указатель на данные, длина данных. И первое, что приходит в голову чтобы изменить строку - добраться до поля с указателем, прибавить к нему индекс байта который надо поменять, разыменовать полученный адрес и что то ему присвоить.

Но в реальности все не так просто и при попытке что то положить по вычисленному адресу программа упадет с segmentation fault (SIGSEGV). Чтобы этого избежать, предварительно надо выдать права на запись в страничку памяти где находится целевая строка. Сделать это можно через системные вызовы.

Код с пояснениями можно скачать тут

Тестил на go version go1.22.2 linux/amd64