有两种类型:
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
稍后在项目上时,我得到一个空的结果。
答案 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)
不要这样做。不要试图太聪明。只需使用带有切片的结构作为成员。它实际上增加了零开销,无论谁以后必须查看你的代码(包括你)都将不胜感激。