5

如果这是一个初学者问题,我深表歉意,但我似乎无法找到任何解决方案。我正在尝试使用一个可以是 astring或 an的参数int,具体取决于上下文,并且我需要确定哪种类型(int如果确实是该类型,则将其转换为。)

谢谢 :)

4

3 回答 3

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"))
}
于 2012-10-04T23:46:34.770 回答
4

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)
}
于 2012-10-04T23:36:48.040 回答
0

我参加聚会有点晚了,但你也可以使用fmt.Sprintf

import "fmt"

func ConvertToString(x interface{}) string {
    return fmt.Sprintf("%v", x)
}

传递"%v"给 Sprintf 告诉它使用它知道的最佳格式对其进行格式化,这实际上只是意味着“将 x 转换为字符串”。这比其他解决方案更短(也许更容易理解),但缺点是它允许输入不是intsstrings.

于 2012-10-06T10:01:40.197 回答