Введение
Эта лабораторная работа проверит ваше понимание указателей в Golang. Указатели используются для передачи ссылок на значения и записи в вашей программе.
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
Эта лабораторная работа проверит ваше понимание указателей в Golang. Указатели используются для передачи ссылок на значения и записи в вашей программе.
Задача заключается в том, чтобы понять, как работают указатели по сравнению с значениями с помощью двух функций: zeroval
и zeroptr
. zeroval
имеет параметр int
, поэтому аргументы будут переданы в нее по значению. zeroval
получит копию ival
, отличную от той, которая находится в вызывающей функции. В отличие от этого, zeroptr
имеет параметр *int
, что означает, что она принимает указатель на int
. Затем код *iptr
в теле функции разыменовывает указатель из его памяти адреса в текущее значение по этому адресу. Присваивание значения разыменованному указателю изменяет значение по ссылке на адрес.
## `zeroval` не изменяет `i` в `main`, но
## `zeroptr` изменяет, потому что имеет ссылку на
## адрес памяти для этой переменной.
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100
Ниже представлен полный код:
// Go поддерживает <em><a href="https://en.wikipedia.org/wiki/Pointer_(computer_programming)">указатели</a></em>,
// позволяя передавать ссылки на значения и записи
// в вашей программе.
package main
import "fmt"
// Мы покажем, как работают указатели по сравнению с значениями с
// помощью 2 функций: `zeroval` и `zeroptr`. `zeroval` имеет
// параметр `int`, поэтому аргументы будут переданы в нее по
// значению. `zeroval` получит копию `ival`, отличную от той,
// которая находится в вызывающей функции.
func zeroval(ival int) {
ival = 0
}
// В отличие от этого, `zeroptr` имеет параметр `*int`, что означает,
// что она принимает указатель на `int`. Затем код `*iptr` в теле
// функции _разыменовывает_ указатель из его памяти адреса в
// текущее значение по этому адресу. Присваивание значения
// разыменованному указателю изменяет значение по ссылке на адрес.
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("initial:", i)
zeroval(i)
fmt.Println("zeroval:", i)
// Синтаксис `&i` дает адрес памяти `i`,
// то есть указатель на `i`.
zeroptr(&i)
fmt.Println("zeroptr:", i)
// Указатели также можно выводить.
fmt.Println("pointer:", &i)
}
В этой лабораторной работе вы узнали, как использовать указатели в Golang. Также вы узнали разницу между передачей значений и указателей в функции.