Приложение Go, создающее SQL-запрос с использованием GROUP_CONCAT для FLOATS, возвращает [] uint8 вместо фактического [] float64 - PullRequest
1 голос
/ 03 апреля 2019

Возникли проблемы с использованием group_concat в запросе, сделанном моим приложением go.

Есть ли идеи, почему group_concat из FLOATS будет выглядеть как [] uint8 на стороне Go?

Может показатьсялибо правильно преобразовать присоски.

Это определенно плавает, я вижу это в необработанных результатах запроса, но когда я делаю тот же запрос в go и пытаюсь. Сканировать результат, Go жалуется, что это []uint8 не []float64 (что на самом деле) Попытки конвертировать в числа с плавающей точкой дают мне неправильные значения (и их слишком много).

Например, в базе данных я запрашиваю и получаю 2float для рассматриваемого столбца выглядит следующим образом:

"5650.50, 5455.00"

Однако на ходу go видит []uint8 вместо []float64.Почему это происходит?Как можно обойти это, чтобы получить фактические результаты?

Моя проблема в том, что я должен использовать этот SQL с group_concat, из-за природы базы данных, с которой я работаю, это лучший способчтобы получить информацию и, что более важно, сам запрос прекрасно работает, возвращает данные, необходимые для функции, но сейчас я не могу их прочитать из-за проблем с типами.Не привыкать к этому, но Го не сотрудничает со мной сегодня.

Я был бы более чем рад узнать, ПОЧЕМУ Го делает это таким образом, и был бы рад узнать, как справиться с этим.

Пример:

SELECT ID, getDistance(33.1543,-110.4353, Loc.Lat, Loc.Lng) as distance,
GROUP_CONCAT(values) FROM stuff INNER JOIN device on device.ID = stuff.ID WHERE (someConditionsETC) GROUP BY ID ORDER BY ID

Фактический результат при взаимодействии с реальной базой данных (не в моем приложении) составляет

"5650.00, 5850.50"

Это явно 2 поплавка.

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

53,55,56,48,46,48,48

Не уверен, как Го ожидает, что я справлюсь с этим.

Решение .... глупо просто и не очень очевидно:

Решение:

crazyBytes := []uint8("5760.00,5750.50")
    aString := string(crazyBytes)
strSlice := strings.Split(aString,",") // string representation of our array (of floats)
var floatz []float64
for _, x := range strSlice {
    fmt.Printf("At last, Float: %s \r\n",x)
    f,err := strconv.ParseFloat(x,64)
    if err != nil { fmt.Printf("Error: %s",err) }
    floatz = append(floatz, f)
    fmt.Printf("as float: %s \r\n", strconv.FormatFloat(f,'f',-1,64))
}

Да, очевидно, СЕЙЧАС.

1 Ответ

1 голос
/ 03 апреля 2019

GROUP_CONCAT возвращает строку.Таким образом, в Go вы получаете массив байтов символов, а не число с плавающей точкой.Результат, который вы разместили 53,55,56,48,46,48,48, переводится в строку "5780.00", которая выглядит как одно из ваших значений.Поэтому вам нужно либо исправить свой SQL, чтобы он возвращал числа с плавающей запятой, либо использовать строки и модули strconv в Go для анализа и преобразования вашей строки в числа с плавающей запятой.Я думаю, что первый подход лучше, но это зависит от вас.

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