ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Go 中查找对象的类型?

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

这是我从中迭代的容器:

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

在这种情况下,我无法获取对象行的类型,即字符串数组。

标准参考不适用于我的程序。我应该把源代码包括在内我不好。
fmt.Printf("%T\n", var)

y
yurenchen

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

}

输出:

Hello, playground
string
int
float64

请参阅:http://play.golang.org/p/XQMcUVsOja 以查看实际情况。

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


反映不是为我工作。我已经更新了这个问题。在这种情况下,我已经包含了代码片段。
J
Jochem Schulenklopper

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

使用 string formatting

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

使用 reflect package

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

使用 type assertions

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”


看来可以去掉变量t,所以t := v.(type)变成了v.(type),就不再需要_ = t了。
基于准系统基准,反射方法的效率惊人地高gist.github.com/mrap/7f08c9549289b6aea2923c27888e7e3e
case 'T': p.fmt.fmtS(reflect.TypeOf(arg).String())。 fmt 包使用反射打印类型
请注意,v.(type) 仅适用于 switch 语句。
F
Faheel

使用 reflect 包:

包反射实现运行时反射,允许程序操作任意类型的对象。典型的用法是取一个静态类型 interface{} 的值,通过调用 TypeOf 提取其动态类型信息,返回一个 Type。

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

产生:

bool
string
int
float64
[]string

Playground

使用 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
}

产生:

bool
string
int
float64
string

Playground


reflect 只显示标准类型。我无法获取列表容器的元素类型。
我已经更新了我的答案以包含一段字符串。 Reflect 适用于任何类型。请阅读文档:golang.org/pkg/reflect & blog.golang.org/laws-of-reflection 应该足够了,尽管有许多与 Go 中的反射相关的 SO 问题也应该对您有所帮助。
ughhh,如何确定类型是否为字符串? if reflect.TypeOf(err) == string
g
globby

要获取字符串表示形式:

来自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)
    }
}

输出:

string
int
float64
bool

h
harold ramos

我会远离反射。包裹。而是使用 %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)
 }

J
Jiten

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


p
pr-pal

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


E
Elie G.

如果我们有这个变量:

var counter int = 5
var message string  = "Hello"
var factor float32 = 4.2
var enabled bool = false

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

fmt.Printf("%T \n",factor )   // factor type: float32

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

fmt.Println(reflect.TypeOf(enabled)) // enabled type:  bool

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

fmt.Println(reflect.ValueOf(counter).Kind()) // counter type:  int

T
Tom Jowitt

您可以使用“反射”包 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)
}

F
Flimzy

获取结构中的字段类型

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

输出

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

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


H
Hasan A Yousef

您可以使用:interface{}..(type),如此 playground

package main
import "fmt"
func main(){
    types := []interface{} {"a",6,6.0,true}
    for _,v := range types{
        fmt.Printf("%T\n",v)
        switch v.(type) {
        case int:
           fmt.Printf("Twice %v is %v\n", v, v.(int) * 2)
        case string:
           fmt.Printf("%q is %v bytes long\n", v, len(v.(string)))
       default:
          fmt.Printf("I don't know about type %T!\n", v)
      }
    }
}

您也可以执行此技巧:switch v := v.(type),然后执行此操作:case int: fmt.Printf("Twice %v is %v\n", v, v * 2)case string: fmt.Printf("%q is %v bytes long\n", v, len(v))。 switch 语句中的内部 v 变量隐藏了原始 v,因此在 case 代码块 v 内假定为 case 语句中指定的类型的变量。
g
grossvater

对于数组和切片,使用 Type.Elem()

a := []string{"foo", "bar", "baz"}
fmt.Println(reflect.TypeOf(a).Elem())

C
Carson

我整理了以下内容。

fmt %T : 值类型的 Go 语法表示 reflect.TypeOf.String() reflect.TypeOf.Kind() 类型断言

例子

package _test

import (
    "fmt"
    "reflect"
    "testing"
)

func TestType(t *testing.T) {
    type Person struct {
        name string
    }
    var i interface{}
    i = &Person{"Carson"}

    for idx, d := range []struct {
        actual   interface{}
        expected interface{}
    }{
        {fmt.Sprintf("%T", "Hello") == "string", true},
        {reflect.TypeOf("string").String() == "string", true},
        {reflect.TypeOf("string").Kind() == reflect.String, true},
        {reflect.TypeOf(10).String() == "int", true},
        {reflect.TypeOf(10).Kind() == reflect.Int, true},
        {fmt.Sprintf("%T", 1.2) == "float64", true},
        {reflect.TypeOf(1.2).String() == "float64", true},
        {reflect.TypeOf(1.2).Kind() == reflect.Float64, true},
        {reflect.TypeOf([]byte{3}).String() == "[]uint8", true},
        {reflect.TypeOf([]byte{3}).Kind() == reflect.Slice, true},
        {reflect.TypeOf([]int8{3}).String() == "[]int8", true},
        {reflect.TypeOf([]int8{3}).Kind() == reflect.Slice, true},
        {reflect.TypeOf(Person{"carson"}).Kind() == reflect.Struct, true},
        {reflect.TypeOf(&Person{"carson"}).Kind() == reflect.Ptr, true},
        {fmt.Sprintf("%v", i.(*Person)) == "&{Carson}", true},
        {fmt.Sprintf("%+v", i.(*Person)) == "&{name:Carson}", true},
    } {
        if d.actual != d.expected {
            t.Fatalf("%d | %s", idx, d.actual)
        }
    }
}

+1 大多数情况下,找出变量是否为字符串的目的是因为我们想根据它有条件地做一些事情。如果我只关心字符串大小写,那么 switch 语句就过分了。这是目前唯一的答案,它显示了使用比较运算符执行类型检查的多种简单方法,而不是平庸地打印类型(对于初学者来说,您将使用什么作为比较器并不明显)。
l
littlepoint

您可以使用 reflect.TypeOf

基本类型(例如:int、string):它将返回其名称(例如:int、string)

struct:它将返回格式为 . 的内容(例如:main.test)


d
dc-code-for-fun

你可以看到这个演示。它演示了如何显示 const 变量的类型。 https://go.dev/play/p/o89rrRj9mPM


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
I
Ismayil Niftaliyev

reflect 包来救援:

reflect.TypeOf(obj).String()

检查此demo


J
JORDANO

您可以只使用 fmt 包中的 fmt.Printf() 方法,更多信息:https://golang.org/pkg/fmt/

示例:https://play.golang.org/p/aJG5MOxjBJD