Golang parse array

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

Имена: EvTremblay 45.39934611083154 -75.71148292845268

[Crestview -75.73795670904249 BellevueManor -75.73886856878032 Dutchie'sHole -75.66809864107668...

Положительные:[45.344387632924054 45.37223315413918 ... ] Отрицательные: []

Вот мой код Может кто-нибудь сказать мне, что вызывает массив Negatives не иметь никаких значений?

func main() {
    fmt.Printf("%q\n", strings.Split("a,b,c", ","))
    var names []string
    var positives, negatives []float64
    bs, err := ioutil.ReadFile("poolss.txt")
    if err != nil {
        return
    }
    str := string(bs)
    fmt.Println(str)
    tokens := strings.Split(str, ",")
    for _, token := range tokens {
        if num, err := strconv.ParseFloat(token, 64); err == nil {
            if num > 0 {
                positives = append(positives, num)
            } else {
                negatives = append(negatives, num)
            }

        } else {
            names = append(names, token)
        }

    fmt.Println(token)
    }

    fmt.Println(fmt.Sprintf("Strings: %v",names))
    fmt.Println(fmt.Sprintf("Positives: %v", positives))
    fmt.Println(fmt.Sprintf("Negatives: %v",negatives))
    for i := range names{
        fmt.Println(names[i])

        fmt.Println(positives[i])

        fmt.Println(negatives[i])
    }
}

3 ответа

Ваш код имеет strings как имя переменной:

var strings []string

а также strings как имя пакета:

tokens := strings.Split(str, ",")

Не делай этого!

strings.Split undefined (type []string has no field or method Split)

Детская площадка: https://play.golang.org/p/HfZGj0jOT-P

Я думаю, что ваша проблема выше связана с дополнительным \n, прикрепленным к каждому плавающему значению - вы не получите отрицательных записей, если вы закончите перевод строки или вы получите его, если у вас нет перевода строки в конце. Поэтому вставьте printf, чтобы вы могли видеть ошибки, которые вы получаете от strconv.ParseFloat, и все станет ясно.

Некоторые небольшие моменты, которые могут помочь:

  • Проверяйте ошибки и не полагайте, что ошибка относится только к одному типу (это то, что вас здесь смущает) - всегда печатайте ошибку, если она появляется, особенно при отладке
  • Не используйте имя пакета для переменной (строки), это не закончится хорошо
  • Используйте структуру данных, которая отражает ваши данные
  • Используйте пакет CSV для чтения данных CSV

Например, для хранения данных, которые вы можете захотеть:

type Place struct {
   Name string 
   Latitude int64
   Longitude int64
}

Затем прочитайте данные в это, в зависимости от того, что столбцы расположены в заданном порядке, и сохраните их в [] месте.

Вот что я попробовал, теперь работает! Спасибо всем за помощь!

func main() {
findRoute("poolss.csv", 5)
 }

func findRoute( filename string, num int) []Edge {
var route []Edge
csvFile, err := os.Open(filename)
if err != nil {
    return route
}
reader := csv.NewReader(bufio.NewReader(csvFile))
var pools []Pool
for {
    line, error := reader.Read()
    if error == io.EOF {
        break
    } else if error != nil {
        log.Fatal(error)
    }
    lat, err := strconv.ParseFloat(line[1], 64)
    long, err := strconv.ParseFloat(line[2], 64)
    if err == nil {
        pools = append(pools, Pool{
            name: line[0],
            latitude:  lat,
            longitude: long,
        })
    }
}
return route
}
Другие вопросы по тегам