如果这是一个初学者问题我很抱歉,但我似乎无法找到任何解决方案。我试图采用可以是string
或int
的参数,具体取决于上下文,我需要确定哪种类型(然后将其转换为int
if确实是那种类型。)
谢谢:)
答案 0 :(得分:7)
例如,
package main
import (
"errors"
"fmt"
"strconv"
)
func IntConv(arg interface{}) (int, error) {
switch x := arg.(type) {
case int:
return x, nil
case string:
return strconv.Atoi(x)
}
return 0, errors.New("IntConv: invalid argument ")
}
func main() {
fmt.Println(IntConv(7))
fmt.Println(IntConv("42"))
}
答案 1 :(得分:3)
http://golang.org/pkg/strconv/#Atoi
func Atoi
func Atoi(s string) (i int, err error)
Atoi is shorthand for ParseInt(s, 10, 0).
这是一次更新。为了澄清,由于Atoi接受字符串,然后尝试传递int
将导致编译时错误。如果你需要在运行时检查,那么你可以做这样的事情。
package main
import (
"fmt"
"strconv"
"errors"
)
func toInt(data interface{}) (n int, err error) {
switch t := data.(type) {
case int:
return t, nil
case string:
return strconv.Atoi(t)
default:
return 0, errors.New(fmt.Sprintf("Invalid type received: %T", t))
}
panic("unreachable!")
}
func main() {
var (
n int
err error
)
n, _ = toInt("1")
fmt.Println(n)
n, _ = toInt(2)
fmt.Println(n)
n, err = toInt(32.3)
fmt.Println(err)
}
答案 2 :(得分:0)
我参加派对有点晚了,但您也可以使用fmt.Sprintf
:
import "fmt"
func ConvertToString(x interface{}) string {
return fmt.Sprintf("%v", x)
}
将"%v"
传递给Sprintf告诉它使用它知道的最佳格式对其进行格式化,这实际上只是意味着“将x转换为字符串”。这比其他解决方案更短(也许更容易理解),但缺点是它允许输入不是ints
或strings
。