Golang中interface {}为nil无法转换为float64的问题
Golang中interface {}为nil无法转换为float64的问题 这是什么意思?我在执行SQL查询获取行数据后遇到这个错误
rows, err := con.Query(`
select
c.playmarket,
c.appstore,
to_json(array_agg(distinct c.jsjs)) as cities
from
( select
z.playmarket,
z.appstore,
( select x from (select z.city_id, z.city_name) x) as jsjs
from (
select
cc.playmarket,
cc.appstore,
from
cards as cc
left join card_city as ccc ON ccc._card = cc.id
left join cities as ci ON ci.id = ccc._city
) z
) as c
group by
c.card_id,
c.playmarket,
c.appstore,
`)
if err != nil {
log.Println(err)
return nil, err
}
var citiesStr string
var cities []map[string]interface{}
var response pb.CardsRes
var itemResponse Cards
j := 0
for rows.Next() {
err = rows.Scan(
&itemResponse.PlayMarket,
&itemResponse.AppStore,
)
if err != nil {
log.Println(err)
return nil, err
}
json.Unmarshal([]byte(citiesStr), &cities)
更多关于Golang中interface {}为nil无法转换为float64的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
7 回复
你能提供一些代码吗?
更多关于Golang中interface {}为nil无法转换为float64的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好的
可能是数据库中可以设为NULL的字段…
我在 pgadmin 中执行了一个 SQL 查询,没有空字段
正如约翰所问,能否向我们展示一些代码?否则我们只是在猜测。
我想我找到了一个错误,不知道为什么最后一行是 nil 类型("<nil>")
这是一个典型的Go语言类型断言问题。当SQL查询返回的字段可能为NULL时,Go的database/sql包会将其扫描为nil interface{},而无法直接赋值给具体的类型如float64。
在你的代码中,itemResponse.PlayMarket和itemResponse.AppStore很可能是float64类型,但数据库中的对应字段可能包含NULL值。
以下是解决方案:
// 方法1:使用sql.NullFloat64
var playMarket sql.NullFloat64
var appStore sql.NullFloat64
for rows.Next() {
err = rows.Scan(
&playMarket,
&appStore,
)
if err != nil {
log.Println(err)
return nil, err
}
// 检查是否为有效值
if playMarket.Valid {
itemResponse.PlayMarket = playMarket.Float64
} else {
itemResponse.PlayMarket = 0 // 或你想要的默认值
}
if appStore.Valid {
itemResponse.AppStore = appStore.Float64
} else {
itemResponse.AppStore = 0 // 或你想要的默认值
}
}
或者使用指针方式:
// 方法2:使用指针
var playMarket *float64
var appStore *float64
for rows.Next() {
err = rows.Scan(
&playMarket,
&appStore,
)
if err != nil {
log.Println(err)
return nil, err
}
if playMarket != nil {
itemResponse.PlayMarket = *playMarket
} else {
itemResponse.PlayMarket = 0
}
if appStore != nil {
itemResponse.AppStore = *appStore
} else {
itemResponse.AppStore = 0
}
}
另外,你的代码中还有几个问题需要修复:
- SQL查询中的字段别名不匹配
citiesStr变量未从数据库扫描- 缺少对
cities字段的扫描
修正后的完整扫描部分:
var playMarket sql.NullFloat64
var appStore sql.NullFloat64
var citiesStr string
for rows.Next() {
err = rows.Scan(
&playMarket,
&appStore,
&citiesStr, // 添加对cities字段的扫描
)
if err != nil {
log.Println(err)
return nil, err
}
// 处理可能为NULL的浮点数值
if playMarket.Valid {
itemResponse.PlayMarket = playMarket.Float64
}
if appStore.Valid {
itemResponse.AppStore = appStore.Float64
}
// 解析JSON
if err := json.Unmarshal([]byte(citiesStr), &cities); err != nil {
log.Println(err)
return nil, err
}
}

