如何在Go中找到一个对象的类型?

Rah*_*hul 339 go go-reflect

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

这是我正在迭代的容器:

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

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

Grz*_*ywo 420

我找到了3种在运行时识别类型的方法:

使用字符串格式

func typeof(v interface{}) string {
    return fmt.Sprintf("%T", v)
}
Run Code Online (Sandbox Code Playgroud)

使用反射包

func typeof(v interface{}) string {
    return reflect.TypeOf(v).String()
}
Run Code Online (Sandbox Code Playgroud)

使用类型断言

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

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

  • 字符串格式 - 短和低占用空间(不需要导入反映包)

  • 反映包 - 当需要更多有关我们可以访问全反射功能的类型的详细信息时

  • type assertions - 允许分组类型,例如将所有int32,int64,uint32,uint64类型识别为"int"

  • 看来你可以摆脱变量`t`,所以`t:= v.(type)`变成`v.(type)`,不再需要`_ = t`. (3认同)
  • 基于准系统基准,反射方法出奇地更有效https://gist.github.com/mrap/7f08c9549289b6aea2923c27888e7e3e (3认同)
  • 请注意,“v.(type)”仅适用于“switch”语句。 (3认同)
  • `case 'T': p.fmt.fmtS(reflect.TypeOf(arg).String())`。fmt 包使用反射打印类型 (2认同)
  • @MikeRapadas,您缺少“switch”反射操作(例如“v.(type)”)。我修改了你的基准测试以另外使用它,结果发现使用“switch”要快得多。尽管该方法有一些警告——人们感兴趣的类型必须明确定义才能有用。[基准测试结果](https://gist.github.com/rrrix/8939a049a069615b83c9bf0fac5ca402)。 (2认同)

det*_*000 415

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))

}
Run Code Online (Sandbox Code Playgroud)

请参阅:http://play.golang.org/p/XQMcUVsOja以查看它的实际效果.

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


Int*_*net 49

使用反射包:

包反射实现了运行时反射,允许程序操纵任意类型的对象.典型的用法是使用静态类型接口{}获取值,并通过调用返回Type的TypeOf来提取其动态类型信息.

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))
}
Run Code Online (Sandbox Code Playgroud)

生产:

bool
string
int
float64
[]string
Run Code Online (Sandbox Code Playgroud)

操场

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

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
}
Run Code Online (Sandbox Code Playgroud)

生产:

bool
string
int
float64
string
Run Code Online (Sandbox Code Playgroud)

操场

  • 呃,我如何确定类型是否为字符串?`if reflect.TypeOf(err) == string`? (3认同)

小智 42

获取字符串表示:

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

%T是值类型的Go语法表示

package main
import "fmt"
func main(){
    types := []interface{} {"a",6,6.0,true}
    for _,v := range types{
        fmt.Printf("%T\n",v)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

string
int
float64
bool
Run Code Online (Sandbox Code Playgroud)


小智 16

我会远离反思.包.而是使用%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)
 }
Run Code Online (Sandbox Code Playgroud)


小智 11

最好的方法是在Google中使用反射概念.
reflect.TypeOf给出类型以及包名称
reflect.TypeOf().Kind()给出下划线类型


pr-*_*pal 8

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


Ham*_*aei 6

如果我们有这个变量:

var counter int = 5
var message string  = "Hello"
var factor float32 = 4.2
var enabled bool = false
Run Code Online (Sandbox Code Playgroud)

1:fmt.Printf %T格式:要使用此功能,您应该导入“fmt”

fmt.Printf("%T \n",factor )   // factor type: float32
Run Code Online (Sandbox Code Playgroud)

2:reflect.TypeOf函数:要使用此功能,您应该导入“reflect”

fmt.Println(reflect.TypeOf(enabled)) // enabled type:  bool
Run Code Online (Sandbox Code Playgroud)

3:reflect.ValueOf(X).Kind():要使用此功能,您应该导入“reflect”

fmt.Println(reflect.ValueOf(counter).Kind()) // counter type:  int
Run Code Online (Sandbox Code Playgroud)


小智 5

获取结构体中的字段类型

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 \n",
          i, typeOfTstObj.Field(i).Name, fieldType.Interface(),
          fieldType.Type())
   }
}
Run Code Online (Sandbox Code Playgroud)

输出

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
Run Code Online (Sandbox Code Playgroud)

在 IDE 中查看https://play.golang.org/p/bwIpYnBQiE


小智 5

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

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)
}
Run Code Online (Sandbox Code Playgroud)