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

Απάντηση από AI

Σε αυτόν τον κώδικα υπάρχουν δύο συναρτήσεις που δέχονται έναν δείκτη σε int, αλλά λειτουργούν διαφορετικά:

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

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

func main() {
    x := 10
    updateV1(&x)
    fmt.Println(x) // Θα εκτυπώσει 10
    updateV2(&x)
    fmt.Println(x) // Θα εκτυπώσει 20
}

Εξήγηση:

  • Στο updateV1, ο παράμετρος px είναι ένα τοπικό αντίγραφο του δείκτη. Η ανάθεση px = &x2 αλλάζει μόνο αυτό το τοπικό αντίγραφο, χωρίς να επηρεάζει τη μεταβλητή x στο main.
  • Στο updateV2, γίνεται απο-αναφορά του δείκτη *px = 20, δηλαδή, αλλάζει η τιμή στη διεύθυνση στην οποία δείχνει το px. Αυτό αλλάζει την τιμή του x στο main.

Αποτέλεσμα: Το updateV1 δεν αλλάζει την αρχική μεταβλητή, ενώ το updateV2 ναι.

Αυτό δείχνει τη διαφορά μεταξύ της αλλαγής ενός τοπικού αντιγράφου δείκτη και της αλλαγής της τιμής στη διεύθυνση στην οποία δείχνει.