如何在 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)
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
我找到了 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”
t
,所以t := v.(type)
变成了v.(type)
,就不再需要_ = t
了。
case 'T': p.fmt.fmtS(reflect.TypeOf(arg).String())
。 fmt 包使用反射打印类型
v.(type)
仅适用于 switch
语句。
使用 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
使用 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
if reflect.TypeOf(err) == string
?
要获取字符串表示形式:
%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
我会远离反射。包裹。而是使用 %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)
}
最好的方法是在 Google 中使用反射概念。
reflect.TypeOf
给出类型以及包名称
reflect.TypeOf().Kind()
给出下划线类型
简而言之,请在 fmt 包中使用 fmt.Printf("%T", var1)
或其其他变体。
如果我们有这个变量:
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
您可以使用“反射”包 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)
}
获取结构中的字段类型
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 中查看
您可以使用: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 语句中指定的类型的变量。
对于数组和切片,使用 Type.Elem()
:
a := []string{"foo", "bar", "baz"}
fmt.Println(reflect.TypeOf(a).Elem())
我整理了以下内容。
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)
}
}
}
您可以使用 reflect.TypeOf
。
基本类型(例如:int、string):它将返回其名称(例如:int、string)
struct:它将返回格式为
你可以看到这个演示。它演示了如何显示 const 变量的类型。 https://go.dev/play/p/o89rrRj9mPM
您可以只使用 fmt 包中的 fmt.Printf() 方法,更多信息:https://golang.org/pkg/fmt/
示例:https://play.golang.org/p/aJG5MOxjBJD