Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-09 16:36:07423parcourir

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)
    }
}

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}

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}

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)
    }
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer