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.PlayMarketitemResponse.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
    }
}

另外,你的代码中还有几个问题需要修复:

  1. SQL查询中的字段别名不匹配
  2. citiesStr变量未从数据库扫描
  3. 缺少对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
    }
}
回到顶部