Golang индексирует массив строк

#go

#Вперед

Вопрос:

Привет, у меня есть строка, которая говорит об этом.

          "Style: Saison
      
          ABV: 7.7
      
      
       IBU: 20"
  

Я пытаюсь разделить его на массив, чтобы я мог получить Saison

Вот как я преобразую в массив.

     style :=strings.Split(style, "Style:")
  

Когда я делаю
style[0]

Он не индексирует Saison. Я также пробовал style [1] и style [2], и ничего не происходит. Что я делаю не так?

Style = []string так что это список строк, верно?

Комментарии:

1. Да, результат разделения равен a []string , но я не понимаю, почему вы думаете, что получите Saison . Попробуйте распечатать все и посмотреть, с чем именно вы работаете.

2. стиль [0] попробуйте это

3. @JimB Вы понимаете, о чем я спрашиваю, прочитайте мой вопрос еще раз, пожалуйста. Я пытаюсь получить Saison.

4. @MattQuaine да, но как бы разбиение Style: и получение 0-го элемента выполнили это?

Ответ №1:

Вы могли бы использовать строки.FieldsFunc:

FieldsFunc разбивает строку s при каждом запуске кодовых точек Unicode c, удовлетворяющих f(c), и возвращает массив фрагментов s. Если все кодовые точки в s удовлетворяют f(c) или строка пуста, возвращается пустой фрагмент.

FieldsFunc не дает никаких гарантий относительно порядка, в котором он вызывает f(c), и предполагает, что f всегда возвращает одно и то же значение для данного c .

 package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    str := `Style: Saison Drink

ABV: 7.7

IBU: 20`
    f := func(c rune) bool {
        return c == ':' || c == 'n'
    }

    strFields := strings.FieldsFunc(str, f)
    fmt.Printf("%qn", strFields)

    styleValue := strings.TrimSpace(strFields[1])
    fmt.Println(styleValue)

    abvValue, err := strconv.ParseFloat(strings.TrimSpace(strFields[3]), 32)
    if err != nil {
        fmt.Println("Error parsing float!")
    }
    fmt.Printf("%.2fn", abvValue)

    ibuValue, err := strconv.ParseInt(strings.TrimSpace(strFields[5]), 10, 32)
    if err != nil {
        fmt.Println("Error parsing int!")
    }
    fmt.Printf("%dn", ibuValue)
}
  

Вывод:

 ["Style" " Saison Drink" "ABV" " 7.7" "IBU" " 20"]
Saison Drink
7.70
20
  

Комментарии:

1. Большое вам спасибо! это хорошо, но то, что между словами был пробел. Нравится «Saison Drink»?

2. Хм, ok обновит ответ для этого нового варианта использования

3. но что, если я хочу получить 7.7? strFields[2] не работает

4. Обновленный ответ 🙂