关于go reflect:如何在Go中找到一个对象的类型?

How to find a type of an object in Go?

如何在Go中找到对象的类型?在Python中,我只是使用typeof来获取对象的类型。同样,在Go中,有没有实现相同的方法?

下面是我要迭代的容器:

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

在本例中,我无法获取对象行的类型,这是一个字符串数组。


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

使用字符串格式

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

使用反射包

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

使用类型断言

1
2
3
4
5
6
7
8
9
10
11
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反射包具有检查变量类型的方法。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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))

    }

    请参见:http://play.golang.org/p/xqmcuvsoja查看它的实际情况。

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


    使用反射包:

    Package reflect implements run-time reflection, allowing a program to
    manipulate objects with arbitrary types. The typical use is to take a
    value with static type interface{} and extract its dynamic type
    information by calling TypeOf, which returns a Type.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package main

    import (
       "fmt"
       "reflect"
    )

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

        fmt.Println(reflect.TypeOf(b))
        fmt.Println(reflect.TypeOf(s))
        fmt.Println(reflect.TypeOf(n))
        fmt.Println(reflect.TypeOf(f))
        fmt.Println(reflect.TypeOf(a))
    }

    生产:

    1
    2
    3
    4
    5
    bool
    string
    int
    float64
    []string

    游乐场

    使用ValueOf(i interface{}).Kind()的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package main

    import (
       "fmt"
       "reflect"
    )

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

        fmt.Println(reflect.ValueOf(b).Kind())
        fmt.Println(reflect.ValueOf(s).Kind())
        fmt.Println(reflect.ValueOf(n).Kind())
        fmt.Println(reflect.ValueOf(f).Kind())
        fmt.Println(reflect.ValueOf(a).Index(0).Kind()) // For slices and strings
    }

    生产:

    1
    2
    3
    4
    5
    bool
    string
    int
    float64
    string

    游乐场


    要获取字符串表示形式:

    来自http://golang.org/pkg/fmt/

    %T a Go-syntax representation of the type of the value

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package main
    import"fmt"
    func main(){
        types := []interface{} {"a",6,6.0,true}
        for _,v := range types{
            fmt.Printf("%T
    ",v)
        }
    }

    输出:

    1
    2
    3
    4
    string
    int
    float64
    bool


    我会远离反射。包裹。改为使用%t

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package main

    import (
       "fmt"
    )

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

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


    最好的方法是在谷歌中使用反射概念。reflect.TypeOf给出了类型和包名称。reflect.TypeOf().Kind()给出下划线类型


    简而言之,请在FMT包中使用fmt.Printf("%T", var1)或其其他变体。


    您可以在运行时使用"reflect"包TypeOf函数或通过使用fmt.Printf()检查任何变量/实例的类型:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package main

    import (
      "fmt"
      "reflect"
    )

    func main() {
        value1 :="Have a Good Day"
        value2 := 50
        value3 := 50.78

        fmt.Println(reflect.TypeOf(value1 ))
        fmt.Println(reflect.TypeOf(value2))
        fmt.Println(reflect.TypeOf(value3))
        fmt.Printf("%T",value1)
        fmt.Printf("%T",value2)
        fmt.Printf("%T",value3)
    }


    to get the type of fields in struct

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package main

    import (
     "fmt"
     "reflect"
    )

    type testObject struct {
      Name   string
      Age    int
      Height float64
    }

    func main() {
       tstObj := testObject{Name:"yog prakash", Age: 24, Height: 5.6}
       val := reflect.ValueOf(&tstObj).Elem()
       typeOfTstObj := val.Type()
       for i := 0; i < val.NumField(); i++ {
           fieldType := val.Field(i)
           fmt.Printf("object field %d key=%s value=%v type=%s
    ",
              i, typeOfTstObj.Field(i).Name, fieldType.Interface(),
              fieldType.Type())
       }
    }

    Output

    1
    2
    3
    object field 0 key=Name value=yog prakash type=string
    object field 1 key=Age value=24 type=int
    object field 2 key=Height value=5.6 type=float64

    See in IDE https://play.golang.org/p/bwIpYnBQiE


    您可以使用reflect.TypeOf

    • 基本类型(如:intstring:返回名称(如:intstring)
    • 结构:它将返回格式为.的内容(例如:main.test)
    • 小精灵


      您只需使用fmt包fmt.printf()方法,更多信息:https://golang.org/pkg/fmt/

      例子:https://play.golang.org/p/ajg5moxjbjd


      反射包来救援:

      1
      reflect.TypeOf(obj).String()

      检查这个演示