为了账号安全,请及时绑定邮箱和手机立即绑定

调用通过 interface{} 传入的 sql.NullFloat64 上的方法抛出错误

调用通过 interface{} 传入的 sql.NullFloat64 上的方法抛出错误

Go
米琪卡哇伊 2021-11-01 10:47:38
我有一个简单的函数,如下所示:func convertToRealNum(number interface{}) interface{}{  switch v := number.(type) {   default:    log.Fatal("unexpected type %T", v)  case sql.NullFloat64:    newNumber := number.Float64  case sql.NullInt64:    newNumber := number.Int64  }  return newNumber }number 是 aNullFloat64或 a NullInt64。如果 number 是 NullFloat64 类型,我会调用 number.Float64 并将数字的值作为 Float64 取回。如果我尝试在一个函数中调用相同的东西,该函数将 number 作为参数作为 interface{} 我得到编译错误:number.Float64 undefined (type interface {} has no field or method Float64)在函数内部,如果我调用reflect.TypeOf(number),它将返回NullFloat64,因此它知道它是什么类型,但我不能调用该类型的方法。
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

数字的实际值(无论它是什么类型)v在类型开关中分配。问题是您number在对 的赋值中重新使用,当您进入它的类型时,它newNumber仍然是旧interface{}的case sql.NullFloat64,因为它的类型v具有numberin的值,因此您需要将它用于赋值。


func convertToRealNum(number interface{}) interface{}{

 var newNumber interface{} 

 switch v := number.(type) { 

  default:

    log.Fatal("unexpected type %T", v)

  case sql.NullFloat64:

    newNumber = v.Float64

  case sql.NullInt64:

    newNumber = v.Int64

  }

  return newNumber  

}


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 249 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信