hitakiri
@hitakiri

Для чего в Go используются указатели и где их лучше использовать?

Есть код. (Go Playground)
package main

import "fmt"

type person struct {
	Name string
	Age  int
}

func showMePerson(d person) {
	fmt.Printf("Person name: %s\nPerson age: %d\n", d.Name, d.Age)
}

func showMePerson2(d *person) {
	fmt.Printf("Person name: %s\nPerson age: %d\n", d.Name, d.Age)
}

func main() {
	d := person{"Nick", 10}
	
	showMePerson(d)
	fmt.Println("======================")
	showMePerson2(&d)
}


Не могу разобраться какими свойствами отличаются функции showMePerson и showMePerson2. И в каких случаях, какую лучше использовать.
  • Вопрос задан
  • 5341 просмотр
Решения вопроса 4
При передаче структуры в функцию showMePerson, структура копируется и внутри функции вы работаете с её копией. При этом, она скорее всего проскакивает через стек и не нагружает сборщик мусора.
При передаче структуры по указателю в функцию showMePerson2 вы работаете с той же структурой, которую передали и можете её менять, например. Но она утекает у вас в кучу, создавая нагрузку на сборщик.
Ответ написан
MAKAPOH
@MAKAPOH
многостаночник
В первом случае при передаче параметра будет скопирована вся структура, во втором только указатель на структуру.

В общем случае можно сказать что передача параметров через указатель ускоряет вызов функции и позволяет изменять внешние по отношению к функции данные. Слишком большое кол-во указателей может замедлить работу всей программы из за наличия сборщика мусора. Но это скорее граничные случаи, как именно поступать надо смотреть в каждом случае отдельно.
Ответ написан
bitver
@bitver
Всё очень хорошо описано в документации.
https://golang.org/doc/effective_go.html#pointers_...
Ответ написан
Комментировать
@svolch
Из существенных моментов, когда делаем метод, изменяющий переданный параметр

func (varV typeT) Set(newValue ValT) - не изменит значение, так как работает с копией varV
func (varV *typeT) Set(newValue ValT) - изменит значение в varV

В вашем же примере, когда внутри функции ничего не меняется - неважно.
Единственно, что если ваш тип данных слишком большой (килобайты) - накладные расходы на копирование переданного параметра могут быть большими.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы