Sobes.tech
Senior

func updateV1(px *int) { x2 := 20 px = &x2 } func updateV2(px *int) { *px = 20 } func main() { x := 10 updateV1(&x) fmt.Println(x) updateV2(&x) fmt.Println(x) }

sobes.tech AI

Vastus AI-lt

Selles koodis on kaks funktsiooni, mis võtavad int-viitaja, kuid töötavad erinevalt:

func updateV1(px *int) {
    x2 := 20
    px = &x2
}

func updateV2(px *int) {
    *px = 20
}

func main() {
    x := 10
    updateV1(&x)
    fmt.Println(x) // Trükib välja 10
    updateV2(&x)
    fmt.Println(x) // Trükib välja 20
}

Selgitus:

  • Funktsioonis updateV1 on parameeter px kohaliku koopiana näitajast. Määramine px = &x2 muudab ainult selle kohaliku koopiana, mitte main-is oleva muutuja x.
  • Funktsioonis updateV2 dereferenceeritakse näitaja *px = 20, mis tähendab, et muudetakse aadressil olevat väärtust, millele px osutab. See muudab main-is oleva muutuja x väärtust.

Tulemus: updateV1 ei muuda algset muutujat, updateV2 aga muudab.

See näitab vahet kohaliku koopiana näitaja muutmise ja väärtuse muutmise aadressil, millele näitaja osutab.