English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Golang

Контрольные операторы Golang

Функция и метод Golang

Структура Golang

Срез и массив Golang

Строка (String) Golang

Указатель Golang

Интерфейс Golang

Конкурентоспособность Golang

Ошибка Golang

Другие темы Golang

Указатель на указатель в Go (двойные указатели)

Указатель в языке программирования Go - это переменная, которая хранит адрес другой переменной. Указатель - это специальная переменная, поэтому он может указывать на переменную любого типа. В основном, это выглядит как цепочка указателей. Когда мы определяем указатель на указатель, первый указатель используется для хранения адреса второго указателя. Этот концепция иногда называетсяДвойные указатели.

Как объявить указатель на указатель в Golang?
указатель объявляется как Pointer, как в Go, объявляя указатель. Разница в том, что我们必须 поместить дополнительную ' перед именем указателя * «. Обычно, когда мы используемключевое слово varи тип указателя переменной, можно выполнить эту операцию.

Пример 1:В следующем примере программы, указательpt2хранениеpt1адрес указателя. Разыменованиеpt2то есть* pt2будет предоставлен переменнаяvадрес, или вы также можете сказать указательpt1Значение. Если вы пытаетесь** pt2,тогда будет предоставлен переменнаяvЗначение, равное 100.

package main
import "fmt"
func main() {
    //Переменная типа int
    var V int = 100
    //Получение указателя
    //Тип int
    var pt1 *int = &V
    //Получение указателя
    //Адрес указателя, на который указывает pt1
    //Преобразование pt1 в pt2
    var pt2 **int = &pt1
    fmt.Println("Значение переменной V = ", V)
    fmt.Println("Адрес переменной V = ", &V)
    fmt.Println("Значение pt1 = ", pt1)
    fmt.Println("Адрес pt1 = ", &pt1)
    fmt.Println("Значение pt2 = ", pt2)
    //Дерференсинг
    //Указатель на указатель
    fmt.Println("Значение адреса pt2 ( *pt2 ) = ", *pt2)
    //Двойной указатель даст значение переменной V
    fmt.Println("*(адрес, содержащий значение pt2) или **pt2 = ", **pt2)
}

Вывод:

Значение переменной V = 100
Адрес переменной V = 0xc000062090
Значение pt1 = 0xc000062090
Адрес pt1 = 0xc00008c018
Значение pt2 = 0xc00008c018
Значение адреса pt2 ( *pt2 ) = 0xc000062090
*(адрес, содержащий значение pt2) или **pt2 = 100

Пример 2:Давайте внесем некоторые изменения в上面的 программу. Изменяем значения указателей, используя dereferencing для назначения новых значений, как показано ниже:

//Пример Go-программы для объяснения концепции указателей на указатели
package main
import "fmt"
func main() {
    //Определение переменной типа int
    var v int = 100
    //Указатель на тип int
    var pt1 *int = &v
    //Получение указателя
    //Адрес указателя, на который указывает pt1
    //Преобразование pt1 в pt2
    var pt2 **int = &pt1
    fmt.Println("Значение переменной v равно ", v)
    //Изменение значения v через присваивание
    //Новое значение для указателя pt1
    *pt1 = 200
    fmt.Println("Значение, хранящееся в v после изменения pt1, равно ", v)
    //Изменение значения v через присваивание
    //Новое значение для указателя pt2
    **pt2 = 300
    fmt.Println("Значение, хранящееся в v после изменения pt2, равно ", v)
}

Вывод:

Значение переменной v равно 100
Значение, хранящееся в v после изменения pt1, равно 200
Значение, хранящееся в v после изменения pt2, равно 300

См. также:相关知识Указатели в Go