указатели

This commit is contained in:
badkaktus 2019-10-07 14:29:50 +03:00
parent ea5bfb9301
commit 1a20196be5
3 changed files with 20 additions and 21 deletions

View File

@ -14,7 +14,7 @@ Switch
Функции с переменным числом аргументов (Variadic Functions) Функции с переменным числом аргументов (Variadic Functions)
Замыкания (Closures) Замыкания (Closures)
Рекурсия (Recursion) Рекурсия (Recursion)
Pointers Указатели (Pointers)
Structs Structs
Methods Methods
Interfaces Interfaces

View File

@ -1,26 +1,25 @@
// Go supports <em><a href="http://en.wikipedia.org/wiki/Pointer_(computer_programming)">pointers</a></em>, // Go поддерживает <em><a href="http://en.wikipedia.org/wiki/Pointer_(computer_programming)">указатели</a></em>,
// allowing you to pass references to values and records // позволяя вам передавать ссылки на значения и записи
// within your program. // в вашей программе.
package main package main
import "fmt" import "fmt"
// We'll show how pointers work in contrast to values with // Мы покажем, как работают указатели, на примере 2 функций:
// 2 functions: `zeroval` and `zeroptr`. `zeroval` has an // `zeroval` и `zeroptr`. В `zeroval` определен только 1
// `int` parameter, so arguments will be passed to it by // аргумент с типом `int`, который передается по значению.
// value. `zeroval` will get a copy of `ival` distinct // `zeroval` получает копию `ival` при вызове функции.
// from the one in the calling function.
func zeroval(ival int) { func zeroval(ival int) {
ival = 0 ival = 0
} }
// `zeroptr` in contrast has an `*int` parameter, meaning // `zeroptr` получает в качестве аргумента параметр `*int`,
// that it takes an `int` pointer. The `*iptr` code in the // который является указателем на `int`. Запись `*iptr` в
// function body then _dereferences_ the pointer from its // теле функции _разыменовывает_ указатель с его адреса
// memory address to the current value at that address. // памяти на текущее значение по этому адресу. Присвоение
// Assigning a value to a dereferenced pointer changes the // значения разыменованному указателю изменяет значение
// value at the referenced address. // по указанному адресу.
func zeroptr(iptr *int) { func zeroptr(iptr *int) {
*iptr = 0 *iptr = 0
} }
@ -32,11 +31,11 @@ func main() {
zeroval(i) zeroval(i)
fmt.Println("zeroval:", i) fmt.Println("zeroval:", i)
// The `&i` syntax gives the memory address of `i`, // Запись `&i` получается ссылку на область памяти, в
// i.e. a pointer to `i`. // которой хранится `i`, т.е. указатель на `i`.
zeroptr(&i) zeroptr(&i)
fmt.Println("zeroptr:", i) fmt.Println("zeroptr:", i)
// Pointers can be printed too. // Указатели могут быть выведены на экран
fmt.Println("pointer:", &i) fmt.Println("pointer:", &i)
} }

View File

@ -1,6 +1,6 @@
# `zeroval` doesn't change the `i` in `main`, but # `zeroval` не изменяет значение `i` в `main`, но
# `zeroptr` does because it has a reference to # `zeroptr` изменяет, т.к. в него передается указатель
# the memory address for that variable. # на область памяти, в которой хранится переменная.
$ go run pointers.go $ go run pointers.go
initial: 1 initial: 1
zeroval: 1 zeroval: 1