О, подождите, если вы никогда раньше не слышали об указателях или не сталкивались с их использованием, этот пост для вас!
Если вы слышали об указателях до этого (возможно, C ++ или C), но все еще не понимаете их. Этот пост даже лучше для вас.

Согласно Википедии, «указатель - это объект языка программирования, значение которого относится (или« указывает ») к другому значению, хранящемуся в другом месте в памяти компьютера, используя его адрес в памяти». Более простое определение состоит в том, что указатель - это значение, указывающее на адрес другого.

Я покажу вам несколько практических примеров использования Go (здесь немного предвзятости), которые должны прояснить ситуацию. Давайте приступим прямо к делу!

Зачем они вообще нужны? Они довольно полезны, как указано ниже:

  • Чтобы присвоить переменную из другой функции
  • Чтобы изменить переменную из функции-члена
  • Для управления копированием при вызове функции

Тем не менее, указатели сложно отлаживать, когда дела идут безумно. Любая функция, которая содержит ссылку на указатель, может изменить его, и «остальное вам известно»

Взгляните на эту программу и изображения, которые ее объясняют;

func main() {
	a := 200 
	b := &a
	*b++
	fmt.Println(a)
}

Я упомянул три момента относительно полезности указателей ранее, но я остановлюсь на двух здесь, третий будет отдельной статьей :)

  1. Чтобы присвоить переменную из другой функции
func reset(value int) {
   value = 0
}

func resetPtr(value *int) {
   *value = 0
}

func main() {
   value := 1
   fmt.Println("initial", value)

   reset(value)
   fmt.Println("after reset", value)

   resetPtr(&value)
   fmt.Println("after resetPtr", value)
}

ВЫХОД

2. Чтобы изменить переменную из функции-члена

type MyType struct {
   value int
   name string
}

func (mt *MyType) reset() {
   mt.value = 0
   mt.name = "Dummy reset name"
}

func (mt *MyType) resetPtr() {
   mt.value = 9
   mt.name = "Dummy pointer reset name"
}

func main() {

   mt := MyType{
      value: 1,
      name: "Sample",
   }
   fmt.Println("Initial name ", mt.name, mt.value)

   mt.reset()
   fmt.Println("After reset() is called ", mt.name, mt.value)

   mt.resetPtr()
   fmt.Println("After resetPointer() with pointer ", mt.name, mt.value)
}

ВЫХОД

Взглянув на каждую программу и соответствующий результат, я надеюсь, вы поймете, как они модифицируются.

Если вы хотите что-нибудь написать по этому поводу, оставьте комментарии.