可以向切片添加append方法

时间:2017-06-19 23:59:27

标签: arrays go

我有类似下面的类型结构:

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

更具体地说,上面没有打印任何内容。

1 个答案:

答案 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...)
}