我如何在围棋中找到对象的类型?在Python中,我只使用typeof来获取对象的类型。在围棋中也有类似的情况,有没有办法实现同样的情况?

下面是我正在迭代的容器:

for e := dlist.Front(); e != nil; e = e.Next() {
    lines := e.Value
    fmt.Printf(reflect.TypeOf(lines))
}

在这种情况下,我无法获得对象行的类型,这是一个字符串数组。


当前回答

我找到了3种在运行时返回变量类型的方法:

使用字符串格式

func typeof(v interface{}) string {
    return fmt.Sprintf("%T", v)
}

使用反射包

func typeof(v interface{}) string {
    return reflect.TypeOf(v).String()
}

使用类型开关

func typeof(v interface{}) string {
    switch v.(type) {
    case int:
        return "int"
    case float64:
        return "float64"
    //... etc
    default:
        return "unknown"
    }
}

每个方法都有不同的最佳用例:

字符串格式——短且占用空间小(不需要导入反射包) 反射包-当需要关于类型的更多细节时,我们可以访问完整的反射功能 类型切换-允许分组类型,例如将所有int32, int64, uint32, uint64类型识别为“int”

其他回答

Go反射包具有检查变量类型的方法。

下面的代码段将打印出字符串、整数和浮点数的反射类型。

package main

import (
    "fmt"
    "reflect"
)

func main() {

    tst := "string"
    tst2 := 10
    tst3 := 1.2

    fmt.Println(reflect.TypeOf(tst))
    fmt.Println(reflect.TypeOf(tst2))
    fmt.Println(reflect.TypeOf(tst3))

}

输出:

string
int
float64

参见:http://play.golang.org/p/XQMcUVsOja查看它的实际操作。

更多文档请访问:http://golang.org/pkg/reflect/#Type

我就会远离反思。包中。而是使用%T

package main

import (
    "fmt"
)

func main() {
    b := true
    s := ""
    n := 1
    f := 1.0
    a := []string{"foo", "bar", "baz"}

    fmt.Printf("%T\n", b)
    fmt.Printf("%T\n", s)
    fmt.Printf("%T\n", n)
    fmt.Printf("%T\n", f)
    fmt.Printf("%T\n", a)
 }

反映包来拯救:

reflect.TypeOf(obj).String()

检查这个演示

如果你想检测if表达式中的类型:

if str, ok := myvar.(string); ok {
    print("It's a string")
}

或者没有类型断言(可能会产生错误):

if reflect.TypeOf(myvar).String() == "string" {
    print("It's a string")
}

简而言之,请使用fmt。Printf(“%T”,var1)或它在fmt包中的其他变体。