Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal

PHPz
Lepaskan: 2024-02-09 16:36:07
ke hadapan
425 orang telah melayarinya

Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal

Dalam PHP, Slice ialah struktur data yang biasa digunakan yang membolehkan kami memilih sebahagian daripada elemen daripada tatasusunan atau kepingan. Walau bagaimanapun, kadangkala kita perlu mengubah suai kepingan dan menambah nilai yang diubah suai pada kepingan asal. Operasi ini boleh dilakukan dalam PHP dengan mengubah suai nilai dalam salinan kepingan dan kemudian menambahkan salinan yang diubah suai pada kepingan asal menggunakan fungsi array_splice. Dalam artikel ini, kami akan memperincikan cara menggunakan kaedah ini untuk melaksanakan pengubahsuaian kepingan dan operasi tambah.

Kandungan soalan

Tulis fungsi yang menyalin kepingan dan mengubah suai nilai item dalam salinan kepingan, kemudian tambahkan salinan itu pada salinan asal. Nampaknya kod itu bukan sahaja mengubah suai salinan kepingan, tetapi juga kepingan asal.

Pergi ke taman permainan

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)
    }
}
Salin selepas log masuk

Apa yang saya nampak sebenarnya

0 {name:a number:2}
1 {name:b number:2}
2 {name:a number:2}
3 {name:b number:2}
Salin selepas log masuk

Apa yang saya harapkan dapat dilihat

0 {name:a number:1}
1 {name:b number:1}
2 {name:a number:2}
3 {name:b number:2}
Salin selepas log masuk

Penyelesaian

@jimb betul, awak salin penunjuk,

Saya cadangkan mentakrifkan fungsi salin kepunyaan item struct untuk mencipta salinan baharu

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)
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Ubah suai nilai dalam salinan kepingan dan tambahkan pada kepingan asal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan