Понимание изменения значений с помощью указателей в Go
В Go указатели обеспечивают непрямой доступ и изменение значений. Однако понимание того, как работают указатели, имеет решающее значение при их передаче в функции.
При передаче указателя в функцию возникают два сценария: изменение значения и переназначение указателя.
Сценарий 1 : Изменение значения
Рассмотрите этот код:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
Здесь функция f получает указатель на структуру Test. Внутри f разыменованному указателю (*p) присваивается новая структура Test со значением 4. Это эффективно изменяет исходную структуру i в основной функции, и на выходе получается 4.
Сценарий 2: Переназначение указателя
Теперь немного изменим код:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
В этом случае вместо изменения указанного значения функция переназначает указатель p на новую структуру Test со значением 4. Поскольку p является локальной переменной внутри f, это изменение не влияет на исходная структура i в основной функции, а результат остается равным 2.
Решение: изменение указанного значения
Чтобы изменить указанное значение, мы должны разыменовать указатель и напрямую доступ к члену структуры:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
Используя p.Value, мы модифицируем поле Value исходной структуры, в результате чего на выходе получается 4.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3