0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Go - язык с передачей аргументов по значению. Это значит, что при передаче переменной в функцию создаётся её копия, и любые изменения внутри функции не затрагивают оригинал. Но если нужно изменить переменную изнутри функции, используется указатель.</p>
1
<p>Go - язык с передачей аргументов по значению. Это значит, что при передаче переменной в функцию создаётся её копия, и любые изменения внутри функции не затрагивают оригинал. Но если нужно изменить переменную изнутри функции, используется указатель.</p>
2
<h2>Передача по значению</h2>
2
<h2>Передача по значению</h2>
3
<p>В этом примере переменная x передаётся по значению. Функция получает копию значения, и изменение n не влияет на x.</p>
3
<p>В этом примере переменная x передаётся по значению. Функция получает копию значения, и изменение n не влияет на x.</p>
4
<h2>Передача указателя</h2>
4
<h2>Передача указателя</h2>
5
<p>Здесь мы передаём в функцию не значение, а указатель на переменную x. Оператор * используется для получения значения по адресу (разыменования). Изменение *number внутри функции приводит к изменению исходной переменной.</p>
5
<p>Здесь мы передаём в функцию не значение, а указатель на переменную x. Оператор * используется для получения значения по адресу (разыменования). Изменение *number внутри функции приводит к изменению исходной переменной.</p>
6
<p>Если присвоить без разыменования внутри функции, то оригинальная переменная x не изменится.</p>
6
<p>Если присвоить без разыменования внутри функции, то оригинальная переменная x не изменится.</p>
7
<h2>Как это работает</h2>
7
<h2>Как это работает</h2>
8
<p>В Go всё передаётся по значению. Но если вы передаёте указатель, то копируется сам указатель (то есть адрес), и обе переменные указывают на одну и ту же область памяти.</p>
8
<p>В Go всё передаётся по значению. Но если вы передаёте указатель, то копируется сам указатель (то есть адрес), и обе переменные указывают на одну и ту же область памяти.</p>
9
<h2>Пример со структурой</h2>
9
<h2>Пример со структурой</h2>
10
<p>Указатели особенно полезны при работе со структурами. Структуры могут содержать много полей, и копирование каждой из них при передаче в функцию может быть неэффективным. Кроме того, иногда нужно изменить структуру внутри функции.</p>
10
<p>Указатели особенно полезны при работе со структурами. Структуры могут содержать много полей, и копирование каждой из них при передаче в функцию может быть неэффективным. Кроме того, иногда нужно изменить структуру внутри функции.</p>
11
<p>Передача структуры по значению:</p>
11
<p>Передача структуры по значению:</p>
12
<p>В этом примере структура User передаётся по значению. Функция rename() работает с копией, а не с оригиналом.</p>
12
<p>В этом примере структура User передаётся по значению. Функция rename() работает с копией, а не с оригиналом.</p>
13
<p>Передача указателя на структуру:</p>
13
<p>Передача указателя на структуру:</p>
14
<p>Теперь в функцию передаётся указатель на User. Мы получаем доступ к оригинальной структуре и можем её изменить. Таким образом мы получаем привычное поведение для других языков, где составные данные передаются по ссылкам.</p>
14
<p>Теперь в функцию передаётся указатель на User. Мы получаем доступ к оригинальной структуре и можем её изменить. Таким образом мы получаем привычное поведение для других языков, где составные данные передаются по ссылкам.</p>
15
<p>Go также позволяет обращаться к полям структуры через указатель без явного разыменования:</p>
15
<p>Go также позволяет обращаться к полям структуры через указатель без явного разыменования:</p>
16
<p>Это сделано для удобства - компилятор сам вставляет *, если это безопасно.</p>
16
<p>Это сделано для удобства - компилятор сам вставляет *, если это безопасно.</p>
17
<h2>Когда использовать указатели</h2>
17
<h2>Когда использовать указатели</h2>
18
<ul><li>Когда нужно изменить значение переменной или структуры внутри функции</li>
18
<ul><li>Когда нужно изменить значение переменной или структуры внутри функции</li>
19
<li>Когда объект большой, и копировать его неэффективно</li>
19
<li>Когда объект большой, и копировать его неэффективно</li>
20
</ul>
20
</ul>