围棋又难倒了我。希望有人可以提供帮助。我创建了一个切片 (mySlice),其中包含指向结构 (myStruct) 的指针。
问题是“删除”方法。当我们在“Remove”里面时一切都很好,但是一旦我们返回,切片大小并没有改变,所以我们看到最后一个元素列出了两次。
我最初尝试使用“添加”方法中使用的相同模式编写“删除”,但它不会编译并且已被注释掉。
我可以通过将新创建的切片返回给调用函数来使其工作,但我不想这样做,因为 mySlice (ms) 是一个单例。
如果我还没有问够...
“添加”方法的代码正在运行,尽管我不确定如何。据我所知,“添加”正在接收指向切片标头(第 3 项“结构”)的指针。根据我的阅读,切片的长度和容量不会传递给方法(当按值传递时),所以也许将指针传递给切片允许方法查看和使用长度和容量,从而允许我们“附加”。如果这是真的,那么为什么相同的模式在“删除”中不起作用?
非常感谢大家的见解和帮助!
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})]