Модификация указателя в 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