将弦线投射到最适合的类型

时间:2016-04-06 17:03:43

标签: go types casting

我知道使用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类型阻止我使用其中的返回值类型,因此也需要这样做。

1 个答案:

答案 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进行回复;最终要么得到相同的结果。