如果这是一个初学者问题,我深表歉意,但我似乎无法找到任何解决方案。我正在尝试使用一个可以是 astring
或 an的参数int
,具体取决于上下文,并且我需要确定哪种类型(int
如果确实是该类型,则将其转换为。)
谢谢 :)
如果这是一个初学者问题,我深表歉意,但我似乎无法找到任何解决方案。我正在尝试使用一个可以是 astring
或 an的参数int
,具体取决于上下文,并且我需要确定哪种类型(int
如果确实是该类型,则将其转换为。)
谢谢 :)
例如,
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"))
}
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 接受字符串,因此尝试传递 anint
将导致编译时错误。如果您需要在运行时进行检查,那么您可以执行类似的操作。
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)
}
我参加聚会有点晚了,但你也可以使用fmt.Sprintf
:
import "fmt"
func ConvertToString(x interface{}) string {
return fmt.Sprintf("%v", x)
}
传递"%v"
给 Sprintf 告诉它使用它知道的最佳格式对其进行格式化,这实际上只是意味着“将 x 转换为字符串”。这比其他解决方案更短(也许更容易理解),但缺点是它允许输入不是ints
或strings
.