[ 断言,判断类型[golang] ]


判断变量类型

  • 使用reflect标准库

案例: 获取结构体里, 每个字段的类型type, 名字name, 值value

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Id   int
    Name string
}

func (u *User) Call() {
    fmt.Println("user is called ..")
    fmt.Printf("%v\n", u)
}

func ToUser(input interface{}) {
    inputType := reflect.TypeOf(input)
    fmt.Println(inputType.Name())
    inputValue := reflect.ValueOf(input)
    fmt.Println(inputValue)

    // 获取结构体里的字段信息
    for i := 0; i < inputType.NumField(); i++ {
        field := inputType.Field(i)
        value := inputValue.Field(i).Interface()

        fmt.Printf("%s: %v = %v \n", field.Name, field.Type, value)
    }

    // 获取结构体里的方法名
    fmt.Println(inputType.NumMethod())
    for i := 0; i < inputType.NumMethod(); i++ {
        m := inputType.Method(i)
        fmt.Printf("%s: 方法, %v: 类型\n", m.Name, m.Type)
    }
}
func main() {
    user := User{1, "chf"}
    ToUser(user)
}