12 lines
1.5 KiB
Markdown
12 lines
1.5 KiB
Markdown
# Как же все таки изменить байты строки в Go?
|
||
Просто захотелось чуть чуть поиграться с пакетом unsafe в Go.
|
||
|
||
Строки (тип string) в Go являются *immutable*, то есть изменять их нельзя. Ну вообще конечно можно, но не напрямую.
|
||
|
||
Строка в Go под капотом является структурой вида: **указатель на данные, длина данных.** И первое, что приходит в голову чтобы изменить строку - добраться до поля с указателем, прибавить к нему индекс байта который надо поменять, разыменовать полученный адрес и что то ему присвоить.
|
||
|
||
Но в реальности все не так просто и при попытке что то положить по вычисленному адресу программа упадет с *segmentation fault (SIGSEGV)*. Чтобы этого избежать, предварительно надо выдать права на запись в страничку памяти где находится целевая строка. Сделать это можно через системные вызовы.
|
||
|
||
Код с пояснениями можно скачать [тут](https://git.hikan.ru/serr/unsafe-change-string-go)
|
||
|
||
Тестил на **go version go1.22.2 linux/amd64** |