Правильно, так что это действительно довольно простая вещь (как я сказал в комментариях):
books := []string{"title 1", "title 2", "title 3"}
list := fmt.Sprintf(
"%s and %s",
strings.Join(books[:len(books)-1], ", "), // join all elements with , excluding last one|
books[len(books)-1], // last element in slice
)
Как это работает:
strings.Join
является частью стандартного пакета strings
, который выполняет то, что делает ваша доморощенная функция impode
. Не нужно писать самому
books[:len(books)-1]
«создает» новый срез, содержащий все элементы исходного среза, кроме последнего. Объединение этих элементов с запятыми - это то, что вы хотите. Вам просто нужен бит and
между этим и последним элементом в срезе.
books[len(books)-1]
получает последний элемент в срезе
fmt.Sprintf("%s and %s"
: создается строка, в которой первая часть представляет собой разделенный запятыми список, созданный strings.Join
, а вторая часть - последний элемент в срезе.
Вместе это дает "title 1, title 2 and title 3"