Владение указателями в Golang

Beginner

This tutorial is from open-source community. Access the source code

Введение

Эта лабораторная работа проверит ваше понимание указателей в Golang. Указатели используются для передачи ссылок на значения и записи в вашей программе.

Указатели

Задача заключается в том, чтобы понять, как работают указатели по сравнению с значениями с помощью двух функций: zeroval и zeroptr. zeroval имеет параметр int, поэтому аргументы будут переданы в нее по значению. zeroval получит копию ival, отличную от той, которая находится в вызывающей функции. В отличие от этого, zeroptr имеет параметр *int, что означает, что она принимает указатель на int. Затем код *iptr в теле функции разыменовывает указатель из его памяти адреса в текущее значение по этому адресу. Присваивание значения разыменованному указателю изменяет значение по ссылке на адрес.

  • Вам должно быть базовое понимание Golang.
  • Вам должно быть известно, как определять и использовать функции в Golang.
  • Вам должно быть известно, как использовать указатели в Golang.
## `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. Также вы узнали разницу между передачей значений и указателей в функции.