指针接收器方法中的内置函数“追加”

有两种类型:


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遍历项目时,我得到一个空结果。


慕妹3242003
浏览 158回答 2
2回答

墨色风雨

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

达令说

不要这样做。不要太聪明。只需使用带有切片的结构作为成员。它实际上增加了零开销,以后需要查看您的代码的任何人(包括您)都会感激不尽。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go