指针接收器方法中的内置函数 "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 上试用。
不要这样做。不要太聪明。只需使用带有切片的结构作为成员。它实际上增加了零开销,以后必须查看您的代码的任何人(包括您)都将不胜感激。
有两种类型:
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 上试用。
不要这样做。不要太聪明。只需使用带有切片的结构作为成员。它实际上增加了零开销,以后必须查看您的代码的任何人(包括您)都将不胜感激。