在指针接收器

时间:2015-07-30 08:11:06

标签: pointers go append slice

有两种类型:

type Headers []HeaderItem

type HeaderItem struct { // This one doesn't really matter. Could be any other type
  Name  string
  Value string
}

我想添加一个带切片的函数作为接收器。我该怎么做这样的事情(伪代码):

func (h *Headers) AddHeaderItem(item HeaderItem) {
    h = &(append( *h, item ))
}

编译器抱怨它,所以这不起作用。

我试过了:

func (h Headers) AddHeaderItem(item HeaderItem) {
    h = append( h, item )
}

这实际上是编译但不符合我的要求:当range稍后在项目上时,我得到一个空的结果。

2 个答案:

答案 0 :(得分:4)

AddHeaderItem()方法h内部是一个指针。您不想更改指针但指向的值:

func (h *Headers) AddHeaderItem(item HeaderItem) {
    *h = append(*h, item)
}

测试它:

h := Headers{}
fmt.Println(h)
h.AddHeaderItem(HeaderItem{"myname1", "myvalue1"})
fmt.Println(h)
h.AddHeaderItem(HeaderItem{"myname2", "myvalue2"})
fmt.Println(h)

输出:

[]
[{myname1 myvalue1}]
[{myname1 myvalue1} {myname2 myvalue2}]

Go Playground上尝试。

答案 1 :(得分:-3)

不要这样做。不要试图太聪明。只需使用带有切片的结构作为成员。它实际上增加了零开销,无论谁以后必须查看你的代码(包括你)都将不胜感激。