Возникли проблемы с использованием 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))
}
Да, очевидно, СЕЙЧАС.