📜  如何在Golang中找到Struct的类型?

📅  最后修改于: 2021-10-24 14:25:55             🧑  作者: Mango

Golang 中的结构体或结构体是一种用户定义的数据类型,它是各种数据字段的组合。每个数据字段都有自己的数据类型,可以是内置类型,也可以是其他用户定义的类型。 Struct 代表具有某些属性/字段集的任何现实世界实体。 Go 不支持类的概念,结构是在这种语言中创建用户定义类型的唯一方法。我们可以通过多种方式识别 Go 中结构的类型:

方法一:使用reflect包

您可以使用反射包来查找给定类型的结构。反射包允许在运行时确定变量的类型。

句法:

func typeofstruct(x interface{}){
    fmt.Println(reflect.TypeOf(x))
}

要么

func typeofstruct(x interface{}){
    fmt.Println(reflect.ValueOf(x).Kind())
}

例子:

package main
  
// importing required modules
import (
    "fmt"
    "reflect"
)
  
//struct Student definition
type Student struct {
    name   string
    rollno int
    phone  int64
    city   string
}
  
func main() {
  
    // making a struct instance
    // note: data fields should be entered in the order
    // they are declared in the struct definition
    var st1 = Student{"Raman", 01, 88888888888, "Mumbai"}
    fmt.Println(reflect.TypeOf(st1))
    fmt.Println(reflect.ValueOf(st1).Kind())
  
    // Naming fields while
    // initializing a struct
    st2 := Student{name: "Naman", rollno: 02, 
            phone: 1010101010, city: "Delhi"}
    fmt.Println(reflect.TypeOf(st2))
    fmt.Println(reflect.ValueOf(st2).Kind())
}

输出:

main.Student
struct
main.Student
struct

方法reflect.TypeOf返回main.Student类型,而reflect.Kind返回一个结构体。这是因为方法reflect.TypeOf返回一个类型为reflect.Type的变量。 reflect.Type包含有关定义所传递变量的类型的所有信息,在本例中为 Student。种类说明了这种类型最初是由什么组成的——指针、整数、字符串、结构体、接口或其他内置数据类型。在我们的例子中,类型是学生,种类是结构。

方法 2:使用类型断言

检查结构类型的另一种方法是使用类型开关并执行多个类型断言。类型开关串联使用多个类型断言并运行第一个匹配类型。在这个 switch 中,case 包含将与 switch 表达式中存在的类型进行比较的类型,如果没有一个 case 匹配,则评估 default case。

句法:

switch optstatement; typeswitchexpression{
case typelist 1: Statement..
case typelist 2: Statement..
...
default: Statement..
}

例子:

// Golang program to find a struct type
// using type assertions
package main
  
import "fmt"
  
// struct Employee definition
type Employee struct {
    name        string
    employee_id int
}
  
func Teststruct(x interface{}) {
    // type switch
    switch x.(type) {
    case Employee:
        fmt.Println("Employee type")
    case int:
        fmt.Println("int type")
    default:
        fmt.Println("Error")
    }
}
  
func main() {
    // Declaring and initializing a
    // struct using a struct literal
    t := Employee{"Ram", 1234}
    Teststruct(t)
}

输出:

Employee type