Проверяет понимание оператора взятия адреса в Go и различий между передачей структуры по значению и по указателю.
В Go амперсанд (&) — это оператор взятия адреса. Когда вы пишете &MyStruct{}, вы создаёте новую структуру и сразу получаете указатель на неё. Указатель — это переменная, которая хранит адрес памяти, где находится структура. Это позволяет работать с оригиналом, а не с копией.
Когда вы передаёте структуру по значению (например, func f(s MyStruct)), Go создаёт полную копию. Изменения внутри функции не влияют на оригинал. Это безопасно, но для больших структур копирование может быть дорогим по памяти и времени. При передаче по указателю (func f(s *MyStruct)) копируется только адрес (8 байт), и изменения затрагивают оригинал.
type Person struct {
Name string
Age int
}
func updateAge(p *Person) {
p.Age = 30 // меняем оригинал
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
p2 := &Person{Name: "Bob", Age: 40} // указатель
updateAge(&p1) // передаём адрес p1
fmt.Println(p1.Age) // 30
fmt.Println(p2.Age) // 40, p2 уже указатель
}Вывод: Амперсанд — это инструмент для работы с адресами памяти. Понимание разницы между значением и указателем помогает писать эффективный и предсказуемый код, особенно при работе с большими данными или изменяемыми состояниями.