Добавить пользовательский метод для строки среза [] - PullRequest
1 голос
/ 12 апреля 2019

Я создаю пакет утилит для своего проекта.

Многие из моих срезов строк нуждаются в функции для 1. удалить дубликаты 2. удалить пустые строки

Я знаю 1 способ сделать это: 1. Добавьте функцию для каждого случая, которая принимает фрагмент строки и возвращает фрагмент строки

func removeEmpty(s []string) []string {

    i := 0 // i points to next available pos

    for _, v := range s {
        if v != "" {
            s[i] = v
            i++
        }
    }

    return s[:i]
}

func dedup(s []string) []string {

    i := 0 // i points to next available pos
    mp := map[string]bool{}

    for _, v := range s {
        if _, ok := mp[v]; !ok {
            s[i] = v
            mp[v] = true
            i++
        }
    }

    return s[:i]
}

когда я применяю эти 2 функции к своему срезу, я могу сделать:

mySlice := string[]{}
mySlice = dedup(removeEmpty(mySlice))

Я хочу сделать что-то вроде:

mySlice = mySlice.dedup().removeEmpty()

или

mySlice.dedup().removeEmpty()

Может быть, я могу добавить пользовательский метод к слайсу []?

Я пытался написать это

func (s []string) removeEmpty() {

}

Я получаю сообщение об ошибке.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Вы не можете определить методы для []string, но вы можете определить свой собственный тип на основе []string и определить методы для этого:

type myStringSlice []string

func (s myStringSlice) removeEmpty() myStringSlice {
    i := 0 // i points to next available pos

    for _, v := range s {
        if v != "" {
            s[i] = v
            i++
        }
    }

    return s[:i]
}

func (s myStringSlice) dedup() myStringSlice {

    i := 0 // i points to next available pos
    mp := map[string]bool{}

    for _, v := range s {
        if _, ok := mp[v]; !ok {
            s[i] = v
            mp[v] = true
            i++
        }
    }

    return s[:i]
}

См. https://play.golang.org/p/u1z_N3c_wPP.

0 голосов
/ 13 апреля 2019

Как указано в документации:

Вы можете объявить метод только с получателем, тип которого определен в том же пакете, что и метод. Вы не можете объявить метод с получателем, тип которого определен в другом пакете.

Таким образом, вы должны объявить тип для []string, а затем объявить метод для вашего собственного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...