我曾试图找到解决这个问题的办法,但对这个问题我一直耿耿于怀。该函数是go-sql Package 器的一部分,调用getjson函数从sql响应中提取信息。
问题是,id参数变成jibberish并且与期望的响应不匹配,所有其他读取的参数都是正确的,所以这让我非常奇怪。
提前感谢您,对于您试图解决这个问题的任何尝试,我们非常感谢:-)
func getJSON(rows *sqlx.Rows) ([]byte, error) {
columns, err := rows.Columns()
rawResult := make([][]byte, len(columns))
dest := make([]interface{}, len(columns))
for i := range rawResult {
dest[i] = &rawResult[i]
}
defer rows.Close()
var results []map[string][]byte
for rows.Next() {
result := make(map[string][]byte, len(columns))
rows.Scan(dest...)
for i, raw := range rawResult {
if raw == nil {
result[columns[i]] = []byte("")
} else {
result[columns[i]] = raw
fmt.Println(columns[i] + " : " + string(raw))
}
}
results = append(results, result)
}
s, err := json.Marshal(results)
if err != nil {
panic(err)
}
rows.Close()
return s, nil
}
从终端获取的响应示例:
id : r�b�X��M���+�2%
name : cat
issub : false
预期结果:
id : E262B172-B158-4DEF-8015-9BA12BF53225
name : cat
issub : false
1条答案
按热度按时间14ifxucb1#
这与类型转换无关。
uuid(任何类型;目前有四个)被定义为一个128位长的字节块,即
128/8=16
字节。这意味着任何字节-不一定可打印。
你要找的是uuid值的字符串表示,它
使用破折号分隔某些字节组。
使用十六进制(base-16)表示法格式化这些组中的每个字节。
由于base-16位置计数用一个数字('0'到'f')表示值0到15,因此一个字节由两个这样的数字表示—每组4位一个数字。
我认为任何合理的uuid包都应该实现一个“解码”函数/方法,该函数/方法将从这16个字节中产生一个字符串表示。
我选择了一个随机包,它是通过执行这个搜索查询生成的,并且
github.com/google/uuid.FromBytes
它从给定的字节片生成uuid,结果值的类型实现String()
产生你想要的东西的方法。