我有类似下面的类型结构:
type Set []*Element
func (set *Set) AppendElements(elements []*Elements) {
// ?
}
显然,简单地将元素附加到切片上并不是很有用。但是,实际函数需要一些值,执行一些业务逻辑,然后附加元素。但是,我面临的困难是修改方法内部的切片,实际上不会将切片的值更改为外部调用者,因为append方法会分配调用者看不到的新切片。
有没有办法在方法中追加切片,或者切片是否应该包含在结构或其他内容中?
package main
import "fmt"
type Element int
type Set []*Element
func (ptr *Set) AppendElements(elements []*Element) {
set := *ptr
set = append(set, elements...)
}
func main() {
i := Element(1)
var set Set
set.AppendElements([]*Element{&i})
for _, el := range set {
fmt.Println(el)
}
}
更具体地说,上面没有打印任何内容。
答案 0 :(得分:3)
您正在修改切片,但您从未将其分配回指针。
func (ptr *Set) AppendElements(elements []*Element) {
set := *ptr
set = append(set, elements...)
*ptr = set
}
通常,可以直接在append
语句中取消引用指针:
func (set *Set) AppendElements(elements []*Element) {
*set = append(*set, elements...)
}