通过接口{}传入的sql.NullFloat64上的调用方法会引发错误

时间:2015-08-10 18:36:09

标签: go

我有一个看起来像这样的简单函数:

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 
}

数字是NullFloat64NullInt64。如果number是NullFloat64类型,我在其上调用number.Float64并将该值作为Float64返回。如果我尝试在一个函数中调用相同的东西,该函数将number作为参数作为接口{}我得到编译错误:

number.Float64 undefined (type interface {} has no field or method Float64)

在函数内部,如果我调用reflect.TypeOf(number),它将返回NullFloat64,因此它知道它是什么类型,但是我不能调用那些类型的方法。

1 个答案:

答案 0 :(得分:0)

数字的实际值(无论它是什么类型)在类型开关中分配给v。问题是,您在number的作业中重复使用newNumber,当您进入interface{}类型的case sql.NullFloat64时,它仍然是旧的v其中number的值为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 } ,因此您需要将其用于分配。

mpc = loadcase('case14')
results = runpf(mpc)
branch_pf = results.branch(:, 14)