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