Maison  >  Article  >  développement back-end  >  Comment cloner des objets dans Golang

Comment cloner des objets dans Golang

PHPz
PHPzoriginal
2023-04-24 14:47:432105parcourir

Dans Golang, cloner un objet peut être utile dans certaines situations. Par exemple, lorsque nous devons opérer sur un objet et conserver son état d’origine. Dans certains cas, nous pouvons avoir besoin de copier un objet dans un autre objet et vouloir appliquer différentes opérations dans le nouvel objet, tandis que l'objet d'origine reste inchangé.

Dans cet article, je vais vous présenter comment cloner un objet dans Golang. Nous explorerons l'utilisation de copies superficielles et profondes pour implémenter le clonage d'objets.

  1. Copie superficielle

La copie superficielle fait référence à la copie d'un objet et à la copie uniquement de la valeur de l'objet et des références à d'autres objets. Dans une copie superficielle, si un champ de l'objet source pointe vers un autre objet, il pointera vers le même objet dans le nouvel objet.

Voici un exemple de code qui montre comment implémenter le clonage d'objets à l'aide de la méthode de copie superficielle :

package main

import "fmt"

type Person struct {
    Name string
    Age  int
    Address *Address
}

type Address struct {
    Street string
    City   string
}

func (p *Person) clone() *Person {
    // Create a new Person struct with the same values as the original
    cloned := *p
    return &cloned
}

func main() {
    original := &Person{
        Name: "John Doe",
        Age:  25,
        Address: &Address{
            Street: "1234 Main St",
            City:   "Anytown",
        },
    }

    // Clone the person
    cloned := original.clone()

    // Update the cloned person's address
    cloned.Address.Street = "5678 Main St"
    cloned.Address.City = "Othertown"

    // Print the original and cloned persons to verify that the original is not affected by the update
    fmt.Println("Original person:", original.Name, original.Age, original.Address.Street, original.Address.City)
    fmt.Println("Cloned person:", cloned.Name, cloned.Age, cloned.Address.Street, cloned.Address.City)
}

Dans le code ci-dessus, nous avons défini une structure Personne, qui comporte des champs Nom, Âge et Adresse. Le champ Adresse est un pointeur vers la structure Adresse. Nous définissons une méthode clone() pour la structure Person, qui est utilisée pour cloner des objets Person.

Dans la fonction main(), nous créons un objet Person nommé original et utilisons la méthode de copie superficielle clone() pour créer un objet Person nommé cloné. Nous mettons ensuite à jour le champ Adresse de l'objet cloné et imprimons les objets Personne d'origine et clonés pour vérifier que l'objet d'origine n'est pas affecté par la mise à jour.

  1. Copie approfondie

La copie approfondie signifie créer un objet complètement indépendant qui contient toutes les valeurs et références de l'objet source. La copie profonde est utilisée lorsque nous devons cloner un objet tout en conservant toutes les valeurs et références de l'objet d'origine.

Ce qui suit est un exemple de code qui utilise la copie complète pour implémenter le clonage d'objets :

package main

import (
    "fmt"
    "encoding/json"
)

type Person struct {
    Name string
    Age  int
    Address *Address
}

type Address struct {
    Street string
    City   string
}

func (p *Person) clone() *Person {
    bytes, _ := json.Marshal(p)
    var cloned Person
    json.Unmarshal(bytes, &cloned)
    return &cloned
}

func main() {
    original := &Person{
        Name: "John Doe",
        Age:  25,
        Address: &Address{
            Street: "1234 Main St",
            City:   "Anytown",
        },
    }

    // Clone the person
    cloned := original.clone()

    // Update the cloned person's address
    cloned.Address.Street = "5678 Main St"
    cloned.Address.City = "Othertown"

    // Print the original and cloned persons to verify that the original is not affected by the update
    fmt.Println("Original person:", original.Name, original.Age, original.Address.Street, original.Address.City)
    fmt.Println("Cloned person:", cloned.Name, cloned.Age, cloned.Address.Street, cloned.Address.City)
}

Dans le code ci-dessus, nous définissons une structure Personne et une structure Adresse. Nous définissons une méthode clone() pour la structure Person, qui utilise l'encodage et le décodage JSON pour effectuer une copie complète.

Dans la fonction main(), nous créons un objet Person nommé original et utilisons la méthode de copie profonde clone() pour créer un objet Person nommé cloné. Nous mettons ensuite à jour le champ Adresse de l'objet cloné et imprimons les objets Personne d'origine et clonés pour vérifier que l'objet d'origine n'est pas affecté par la mise à jour.

Résumé

Dans Golang, vous pouvez utiliser les méthodes de copie superficielle et de copie profonde pour cloner un objet. Une copie superficielle copie uniquement la valeur d'un objet et les références à d'autres objets, tandis qu'une copie profonde copie l'objet entier, y compris ses références.

Clonez un objet plus rapidement à l'aide de copies superficielles, mais si les valeurs et les références de l'objet source changent fréquemment, l'objet cloné sera également affecté. L'utilisation d'une copie complète préserve toutes les valeurs et références à l'objet d'origine, mais sa réalisation peut nécessiter plus de temps et de mémoire. Ainsi, lorsque vous utilisez la méthode de clonage, choisissez celle qui convient en fonction de vos besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn