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

GolangGolangBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go/DataTypesandStructuresGroup -.-> go/pointers("Pointers") subgraph Lab Skills go/pointers -.-> lab-15494{{"Владение указателями в Golang"}} end

Указатели

Задача заключается в том, чтобы понять, как работают указатели по сравнению с значениями с помощью двух функций: 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. Также вы узнали разницу между передачей значений и указателей в функции.