Встроенный func "append" в методе для получения указателя
Имея два типа:
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 ответа
Решение
Внутри 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.
Не делай этого. Не пытайся быть слишком умным. Просто используйте структуру со срезом в качестве члена. Это добавляет буквально ноль накладных расходов, и кто бы ни должен был взглянуть на ваш код позже (включая вас), будет благодарен.