指针接收器方法中的内置函数 "append"

Builtin func "append" in method for pointer receiver

有两种类型:

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 查看这些项目时,我得到一个空结果。

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 上试用。

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