我知道使用strconv
包,可以将字符串解析为他们需要的任何类型。但是,通过我正在编写的程序,我不知道在运行时需要解析的变量的最佳类型。有没有比我更好的方法呢? (我的代码很难看,很糟糕,而且非常糟糕。我真的希望找到更好的解决方案。)
import(
"strconv"
"fmt"
)
type object interface{}
func parse(raw string,block int) object{
if block==0{
if raw=="true"{
return true
}else if raw=="false"{
return false
}else{
parse(raw,block+1)
}
}else if block==1{
res,err:=strconv.ParseFloat(raw,64)
if err!=nil{parse(raw,block+1)}
return res
}else if block==2{
res,err:=strconv.ParseInt(raw,10,64)
if err!=nil{parse(raw,block+1)}
return res
}
return raw
}
编辑:使用object
类型阻止我使用其中的返回值类型,因此也需要这样做。
答案 0 :(得分:-1)
原始示例是正确的,但并非所有有用,并且它不能满足OP的要求。我已经更新了答案,以便它在给定的上下文中工作......我希望它也有帮助。
您可以返回接口{},然后打开返回类型,如下所示:
package main
import "strconv"
func parse(raw string, block int) interface{} {
if block == 0 {
if raw == "true" || raw == "false" {
if ok, err := strconv.ParseBool(raw); err == nil {
return ok
}
}
return parse(raw, block+1)
} else if block == 1 {
if res, err := strconv.ParseInt(raw, 10, 64); err == nil {
return res
}
return parse(raw, block+1)
} else if block == 2 {
if res, err := strconv.ParseFloat(raw, 64); err == nil {
return res
}
return parse(raw, block+1)
}
return raw
}
func main() {
a := parse("10.1", 0)
switch a.(type) {
case bool:
//do something with a.(bool))
case float64:
//do something with a.(float64))
case int64:
//do something with a.(int64))
case string:
// do something with a.(string)
}
}
这与您的原始示例之间存在显着差异:
你必须返回那个半递归函数调用,而不仅仅是调用它,否则你最终会返回raw,除非你的第一个案例(block == 0
)返回。
有必要在ParseInt()
之前检查ParseFloat()
,因为int总能满足浮点数的条件,而不是相反。
除非您需要返回类型的方法,否则只需返回接口{},并且无需声明类型。
最后,除了风格之外没有其他原因,我选择在err == nil
上与parse(raw, block+1)
上的err != nil
进行回复;最终要么得到相同的结果。