Go语言向结构体切片append元素报错invalidAppend的解决咨询
问题分析与解决
你的代码报错是因为AddItem方法里错误地将切片指针传给了append函数,而append要求第一个参数必须是切片类型,不是指针。
错误原因
在AddItem方法中,接收者il是*ItemsList类型(本质是*[]Item,切片的指针),直接调用append(il, i)时,第一个参数是指针,不符合append的参数要求,因此触发invalidAppend错误。
修正代码
只需要对指针进行解引用,拿到实际的切片后再调用append,最后将新切片赋值回指针指向的对象:
type Item struct { Attr string } type ItemsList []Item type IItemsList interface { GetItemsList() ItemsList AddItem(Item) } func NewItemsList() IItemsList { return &ItemsList{} } func (il *ItemsList) GetItemsList() ItemsList { return *il } func (il *ItemsList) AddItem(i Item) { // 解引用指针得到切片,append后赋值回指针指向的对象 *il = append(*il, i) }
原理说明
append函数会返回一个新的切片(当原切片容量不足时会重新分配内存),通过*il = append(*il, i),我们把新切片的引用更新到原指针指向的切片变量中,这样就能正确完成元素追加操作。
内容的提问来源于stack exchange,提问作者LTX
相关产品推荐
相关产品推荐

