我有一個接受 SQL 查詢的服務,使用數據庫/sql 驅動程序在 Amazon Redshift 上運行查詢。但是,我無法將結果轉換為結構,因為查詢是各種表上的大數據任務,而不是在此服務中創建的。所以我必須返回一個“松散”的數據結構。我正在解析返回到 JSON 中的數據并將其存儲在 S3 中。但是,我在返回的數據類型方面遇到了一些奇怪的問題。對于數字列的查詢返回 uint8 的映射而不是數字值。我知道這是因為數據庫驅動程序無法決定將其轉換為什么,因為它可能不精確。但我似乎也無法在 []uint8 和整數之間進行轉換。這是我查詢數據庫的代碼:// Execute executes SQL commandsfunc (r *Runner) Execute(query string, args ...interface{}) (types.Results, error) { var results types.Results rows, err := r.db.Query(query, args...) if err != nil { return results, err } columns, _ := rows.Columns() colNum := len(columns) values := make([]interface{}, colNum) for i := range values { var ii interface{} values[i] = &ii } for rows.Next() { rows.Scan(values...) result := make(types.Result) for i, colName := range columns { rawValue := *(values[i].(*interface{})) if reflect.TypeOf(rawValue).String() == "[]uint8" { byteVal := rawValue.([]byte) val := Intfrombytes(byteVal) log.Println("Converted:", val) } result[colName] = rawValue } results = append(results, result) } return results, nil}我創建了以下函數來嘗試在[]uint8和之間進行轉換uint32。func Intfrombytes(bytes []uint8) uint16 { bits := binary.LittleEndian.Uint16(bytes) return bits}但是,如果我插入200該表,我會返回12339。一般來說,這種方法感覺很不穩定。我懷疑我為此使用 Go 的決定,因為我正在處理未定義的、松散的數據結構。是否有更好的方法來處理通用查詢(例如我的示例),或者是否有方法可以將我的數字結果轉換為整數?
1 回答

慕哥6287543
TA貢獻1831條經驗 獲得超10個贊
我認為您實際上可能正在解釋一個字符串 ([]uint8 == []byte)。請參閱https://play.golang.org/p/Rfpey2NPiI7
originalValue := []uint8{0x32, 0x30, 0x30} // "200"
bValue := []byte(originalValue) // byte is a uint8 anyway
fmt.Printf("Converted to uint16: %d\n", binary.LittleEndian.Uint16(bValue))
fmt.Printf("Actual value: %s", string(bValue))
在處理pq一些加密代碼之前,這讓我很痛苦。
- 1 回答
- 0 關注
- 142 瀏覽
添加回答
舉報
0/150
提交
取消