Метод на срез - PullRequest
       38

Метод на срез

1 голос
/ 11 мая 2019

Хотя я думаю, что проблема, которая у меня есть, не правильно описана в заголовке, это единственный способ, которым я могу описать ее сейчас.

У меня есть структура Mini, которая определена в другом файле.Набор Minis должен быть описан как срез.Поскольку я хочу изменить некоторые поля структуры Mini, когда она добавляется к срезу, необходимы специальные функции для добавления.

До сих пор я получил следующий код:

import (
    "fmt"
    "reflect"
)

//Minis is a slice of all Minis
type Minis struct {
    AllMinis []*Mini
}

//Append adds a new Mini to the Minis slice
func (m *Minis) Append(n *Mini) {
    m.AllMinis = append(m.AllMinis, n)
}

Этот код работает совершенно нормально.Но, на мой взгляд, структура с одним полем выглядит бессмысленной.

Есть ли способ создать метод для структуры или более элегантное решение в целом?

Спасибо!

1 Ответ

4 голосов
/ 11 мая 2019

Объявить тип как срез:

//Minis is a slice of all Minis
type Minis []*Mini

//Append adds a new Mini to the Minis slice
func (m *Minis) Append(n *Mini) {
    *m = append(*m, n)
}

Запустите его на детской площадке .

concat паникует, потому что QForename передает нулевой указатель среза в качестве получателя на concat. Исправить с помощью ненулевого указателя:

func (m *Minis) QForename(q string) *Minis {
    var matches Minis
    for _, n := range *m {
        if n.Forename == q {
            matches.concat(n)
        }
    }
    return &matches
}
...