О, подождите, если вы никогда раньше не слышали об указателях или не сталкивались с их использованием, этот пост для вас!
Если вы слышали об указателях до этого (возможно, C ++ или C), но все еще не понимаете их. Этот пост даже лучше для вас.
Согласно Википедии, «указатель - это объект языка программирования, значение которого относится (или« указывает ») к другому значению, хранящемуся в другом месте в памяти компьютера, используя его адрес в памяти». Более простое определение состоит в том, что указатель - это значение, указывающее на адрес другого.
Я покажу вам несколько практических примеров использования Go (здесь немного предвзятости), которые должны прояснить ситуацию. Давайте приступим прямо к делу!
Зачем они вообще нужны? Они довольно полезны, как указано ниже:
- Чтобы присвоить переменную из другой функции
- Чтобы изменить переменную из функции-члена
- Для управления копированием при вызове функции
Тем не менее, указатели сложно отлаживать, когда дела идут безумно. Любая функция, которая содержит ссылку на указатель, может изменить его, и «остальное вам известно»
Взгляните на эту программу и изображения, которые ее объясняют;
func main() { a := 200 b := &a *b++ fmt.Println(a) }
Я упомянул три момента относительно полезности указателей ранее, но я остановлюсь на двух здесь, третий будет отдельной статьей :)
- Чтобы присвоить переменную из другой функции
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) }
ВЫХОД
Взглянув на каждую программу и соответствующий результат, я надеюсь, вы поймете, как они модифицируются.
Если вы хотите что-нибудь написать по этому поводу, оставьте комментарии.