Maison > développement back-end > Golang > Modifier les valeurs dans une copie d'une tranche et les ajouter à la tranche d'origine

Modifier les valeurs dans une copie d'une tranche et les ajouter à la tranche d'origine

PHPz
Libérer: 2024-02-09 16:36:07
avant
454 Les gens l'ont consulté

Modifier les valeurs dans une copie dune tranche et les ajouter à la tranche dorigine

En PHP, Slice est une structure de données couramment utilisée qui nous permet de sélectionner une partie d'éléments d'un tableau ou d'une tranche. Cependant, nous devons parfois modifier la tranche et ajouter la valeur modifiée à la tranche d'origine. Cette opération est possible en PHP en modifiant la valeur dans la copie de la tranche puis en ajoutant la copie modifiée à la tranche d'origine à l'aide de la fonction array_splice. Dans cet article, nous détaillerons comment utiliser cette méthode pour implémenter des opérations de modification de tranche et d'ajout.

Contenu de la question

Écrivez une fonction qui copie une tranche et modifie les valeurs des éléments dans la copie de la tranche, puis ajoute la copie à la copie originale. Il semble que le code modifie non seulement la copie de la tranche, mais également la tranche d'origine.

Aller au terrain de jeux

import "fmt"

type item struct {
    name   string
    number int
}

func main() {
    names := []string{"a", "b"}
    numbers := []int{1, 2}

    items := []*item{}

    for _, name := range names {
        item := &item{name: name}
        items = append(items, item)
    }

    for n, i := range numbers {
        if n > 0 {
            fmt.println(n, "make a copy of the items")
            itemcopies := make([]*item, len(items))
            copy(itemcopies, items)

            fmt.println(n, "set the numbers on the copies")
            for _, item := range itemcopies {
                item.number = i
            }

            fmt.println(n, "append the copies to the original")
            items = append(items, itemcopies...)
        } else {

            fmt.println(n, "first pass set all the items to the first number")
            for _, item := range items {
                item.number = i
            }
        }
    }

    for n, i := range items {
        fmt.printf("%d %+v\n", n, *i)
    }
}
Copier après la connexion

Ce que j'ai réellement vu

0 {name:a number:2}
1 {name:b number:2}
2 {name:a number:2}
3 {name:b number:2}
Copier après la connexion

Qu'est-ce que je m'attends à voir

0 {name:a number:1}
1 {name:b number:1}
2 {name:a number:2}
3 {name:b number:2}
Copier après la connexion

Solution

@jimb a raison, vous copiez le pointeur,

Je suggère de définir une fonction de copie appartenant à struct item pour créer une nouvelle copie

package main

import "fmt"

type Item struct {
    name   string
    number int
}

func (it *Item) copy() *Item {
    return &Item{
        name:   it.name,
        number: it.number,
    }
}
func main() {
    names := []string{"a", "b"}
    numbers := []int{1, 2}

    items := []*Item{}

    for _, name := range names {
        item := &Item{name: name}
        items = append(items, item)
    }

    for n, i := range numbers {
        if n > 0 {
            fmt.Println(n, "make a copy of the items")
            itemCopies := make([]*Item, len(items))

            for j := 0; j < len(items); j++ {
                itemCopies[j] = items[j].copy()
            }
            fmt.Println(n, "set the numbers on the copies")
            for _, item := range itemCopies {
                item.number = i
            }

            fmt.Println(n, "append the copies to the original")
            items = append(items, itemCopies...)
        } else {

            fmt.Println(n, "first pass set all the items to the first number")
            for _, item := range items {
                item.number = i
            }
        }
    }

    for n, i := range items {
        fmt.Printf("%d %+v\n", n, *i)
    }
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal