返回顶部
首页 > 资讯 > 精选 >修改切片副本中的值然后附加到原始切片
  • 832
分享到

修改切片副本中的值然后附加到原始切片

2024-02-09 16:02:39 832人浏览 薄情痞子
摘要

在PHP中,切片(Slice)是一种常用的数据结构,它允许我们从一个数组或切片中选取一部分元素。然而,有时候我们需要对切片进行修改,并将修改后的值附加到原始切片中。这种操作在php中是

PHP中,切片(Slice)是一种常用的数据结构,它允许我们从一个数组或切片中选取一部分元素。然而,有时候我们需要对切片进行修改,并将修改后的值附加到原始切片中。这种操作在php中是可以实现的,通过修改切片副本中的值,然后使用array_splice函数将修改后的副本附加到原始切片中即可。在本文中,我们将详细介绍如何使用这种方法实现切片的修改和附加操作。

问题内容

编写一个函数来复制切片并修改切片副本中项目的值,然后将副本附加到原始副本。看起来代码不仅修改了切片的副本,还修改了原始切片。

去游乐场

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

我实际看到的

0 {name:a number:2}
1 {name:b number:2}
2 {name:a number:2}
3 {name:b number:2}

我期望看到什么

0 {name:a number:1}
1 {name:b number:1}
2 {name:a number:2}
3 {name:b number:2}

解决方法

@jimb 是对的,你复制指针,

我建议定义一个属于struct item的copy函数来新建一个副本

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

以上就是修改切片副本中的值然后附加到原始切片的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 修改切片副本中的值然后附加到原始切片

本文链接: https://lsjlt.com/news/562701.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 修改切片副本中的值然后附加到原始切片
    在PHP中,切片(Slice)是一种常用的数据结构,它允许我们从一个数组或切片中选取一部分元素。然而,有时候我们需要对切片进行修改,并将修改后的值附加到原始切片中。这种操作在PHP中是...
    99+
    2024-02-09
  • 如何附加到元素类型不是golang中命名类型的切片
    php小编香蕉为您介绍如何附加到元素类型不是golang中命名类型的切片。在Golang中,我们可以使用内置的append函数将元素附加到切片中,但是如果切片的元素类型不是命名类型,即...
    99+
    2024-02-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作