Возвращает последний элемент строки. Split () срез в Golang - PullRequest
0 голосов
/ 13 мая 2018

Я разделяю имен файлов в Go, чтобы получить расширение файла (например, import ("strings") ; strings.Split("example.txt", ".")). По этой причине я хотел бы вернуть последний элемент в срезе, возвращенный разделением, т. Е.

для строк. Split ("ex.txt", "."), Я хочу txt

Этот вопрос предполагает, что

strings.Split("ex.txt", ".")[len(strings.Split("ex.txt", ".")) - 1]

- единственный способ достичь этого. То есть, нет -1 как в Python. Это кажется мне очень расточительным, так как я чувствую, что мы выполняем одну и ту же операцию разделения дважды.

  • Нет ли лучшей команды для получения последнего элемента фрагмента в Go?
  • Если нет, лучше ли было бы записать результат Split в переменную или просто выполнить вышеописанное?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Я бы использовал пакет filepath, а не разбирал его сам:

import "path/filepath"

s := "file.ext"
ext := filepath.Ext(s)
if len(ext) != 0 {
    fmt.Printf("ext = %s\n", ext[1:])
} else {
    fmt.Printf("no ext\n")
}

Это будет работать как с полным путем, так и с именем файла.

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

strings.LastIndex делает это довольно аккуратно:

s := "Hello,Stack,Overflow"
last := s[strings.LastIndex(s, ",")+1:]
fmt.Println(last)

возвращает «Переполнение». Если строка поиска не найдена, она возвращает всю строку, что логично.

Детская площадка здесь

0 голосов
/ 13 мая 2018

Вы должны присвоить результаты разделения переменной, а не вызывать ее дважды.

ss := strings.Split(msg, ".")
s := ss[len(ss)-1]

(Обратите внимание, что это позволяет (или, возможно, вынуждает) вас разобраться со случаем, когда ss пусто или что-то еще неожиданно явно, перед индексацией.)

Если вы делаете это снова и снова, и это оскорбляет вас тем, что вам нужно использовать две строки (или две строки плюс обработку ошибок) вместо одной, вы можете довольно просто абстрагировать ее в функцию:

func lastString(ss []string) string {
    return ss[len(s)-1]
}

s1 := lastString(strings.Split("example.txt", "."))
s2 := lastString(strings.Split("example.jpg", "."))

В конце концов, передача результата функции в качестве аргумента имеет практически тот же эффект, что и привязка его к переменной.

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