«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему изменение указателя в функциях Go иногда не влияет на исходное значение?

Почему изменение указателя в функциях Go иногда не влияет на исходное значение?

Опубликовано 7 ноября 2024 г.
Просматривать:799

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Модификация указателя в Go, понимание различий

В Go при передаче указателя на функцию мы обычно намереваемся изменить значение на который указывает этот указатель. Обычно этого можно достичь путем разыменования, как показано в следующем коде:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}

Однако могут быть случаи, когда значение структуры, на которую указывает переданный указатель, остается неизменным даже после его изменения внутри функции. Чтобы понять, почему это происходит, давайте рассмотрим измененный фрагмент кода:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}

Этот фрагмент кода пытается изменить значение указателя p, но не может изменить значение структуры, на которую первоначально указывалось. Причина этого в том, что присвоение p = &Test{4} внутри функции f() изменяет только значение локальной переменной p.

Внутри функции f() p рассматривается как локальная переменная. и присвоение ему нового значения не влияет на значение указателя, переданного из функции main(). Следовательно, структура, на которую указывает p, остается неизменной, что отражается в неизмененном значении i.Value при печати.

Напротив, следующий код демонстрирует правильный подход к изменению значения структуры:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}

В этом коде p.Value = 4 напрямую изменяет поле Value структуры, на которую указывает p. Это приводит к желаемой модификации значения структуры, что отражается в обновленном значении i.Value при печати.

Стоит отметить, что присвоение нового значения самому указателю (как в p = &Test{ 4}) имеет другой эффект. Это присвоение создаст новый указатель, указывающий на новую структуру, но не повлияет на значение структуры, на которую указывает исходный указатель, переданный из функции main().

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3