gpt4 book ai didi

go - 如何通过调用 slice 上的方法从 slice 中删除项目

转载 作者:IT老高 更新时间:2023-10-28 13:09:08 25 4
gpt4 key购买 nike

围棋又难倒了我。希望有人可以提供帮助。我创建了一个 slice (mySlice),其中包含指向结构 (myStruct) 的指针。

问题在于“删除”方法。当我们在“Remove”里面时一切都很好,但是一旦我们返回, slice 大小并没有改变,所以我们看到最后一个元素列出了两次。

我最初尝试使用“添加”方法中使用的相同模式编写“删除”,但它无法编译并已被注释掉。

我可以通过将新创建的 slice 返回给调用函数来使其工作,但我不想这样做,因为 mySlice (ms) 是一个单例。

如果我还没有问够的话......

“添加”方法的代码正在运行,虽然我不确定如何。据我所知,“添加”正在接收指向 slice header (第 3 项“结构”)的指针。根据我的阅读, slice 的长度和容量不会传递给方法(当按值传递时),所以也许将指针传递给 slice 允许方法查看和使用长度和容量,从而允许我们“附加”。如果这是真的,那么为什么相同的模式在“删除”中不起作用?

非常感谢大家的见解和帮助!

package main

import (
"fmt"
)

type myStruct struct {
a int
}
type mySlice []*myStruct

func (slc *mySlice) Add(str *myStruct) {
*slc = append(*slc, str)
}

//does not compile with reason: cannot slice slc (type *mySlice)
//func (slc *mySlice) Remove1(item int) {
// *slc = append(*slc[:item], *slc[item+1:]...)
//}

func (slc mySlice) Remove(item int) {
slc = append(slc[:item], slc[item+1:]...)
fmt.Printf("Inside Remove = %s\n", slc)
}

func main() {
ms := make(mySlice, 0)
ms.Add(&myStruct{0})
ms.Add(&myStruct{1})
ms.Add(&myStruct{2})
fmt.Printf("Before Remove: Len=%d, Cap=%d, Data=%s\n", len(ms), cap(ms), ms)
ms.Remove(1) //remove element 1 (which also has a value of 1)
fmt.Printf("After Remove: Len=%d, Cap=%d, Data=%s\n", len(ms), cap(ms), ms)
}

结果...

Before Remove:  Len=3, Cap=4, Data=[%!s(*main.myStruct=&{0}) %!s(*main.myStruct=&{1}) %!s(*main.myStruct=&{2})]

Inside Remove = [%!s(*main.myStruct=&{0}) %!s(*main.myStruct=&{2})]

After Remove: Len=3, Cap=4, Data=[%!s(*main.myStruct=&{0}) %!s(*main.myStruct=&{2}) %!s(*main.myStruct=&{2})]

最佳答案

您第一次使用 Remove1() 时是对的。 Remove 获取 slice 的副本,因此无法更改 slice 的长度。

remove 函数中的问题是,根据 Go 中的操作顺序, slice 先于解引用。

修复方法是将 *slc = append(*slc[:item], *slc[item+1:]...) 更改为 *slc = append((* slc)[:item], (*slc)[item+1:]...).

但是,为了可读性和可维护性,我建议以下内容:

func (slc *mySlice) Remove1(item int) {
s := *slc
s = append(s[:item], s[item+1:]...)
*slc = s
}

关于go - 如何通过调用 slice 上的方法从 slice 中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18566499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com