golang如何将空接口通过类型断言成动态反射出来的类型?

package main

import "reflect"

type people struct {
    name string
    age int
}

func test(a interface{}) {
    // fmt.Println(a.(people)) 但是如果事先并不知道能类型断言成什么类型的话,如何转换?
    rtype := reflect.TypeOf(a)
    a.(rtype) // err: rtype is not a type
}

func main() {
    var p1 people
    test(p1)
}
阅读 4.2k
3 个回答

你都不知道什么类型了怎么转换?rtype是一个结构对象,类型为一个结构体,它实现了 reflect.Type 接口。

不知道你要实现什么会需要这种转换?

当一个形参作为interface{}类型传递,就以为着它可能是任何可能的具体类型,这个时候通常的做法如下:

switch f := arg.(type) {
case bool:
//todo
case string:
//todo 
}

未知原有类型可以遍历Filed

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Id   int
    Name string
    Age  int
}

func (u User) ReflectCallFunc() {
    fmt.Println("Allen.Wu ReflectCallFunc")
}

func main() {

    user := User{1, "Allen.Wu", 25}

    DoFiledAndMethod(user)

}

// 通过接口来获取任意参数,然后一一揭晓
func DoFiledAndMethod(input interface{}) {

    getType := reflect.TypeOf(input)
    fmt.Println("get Type is :", getType.Name())

    getValue := reflect.ValueOf(input)
    fmt.Println("get all Fields is:", getValue)

    // 获取方法字段
    // 1. 先获取interface的reflect.Type,然后通过NumField进行遍历
    // 2. 再通过reflect.Type的Field获取其Field
    // 3. 最后通过Field的Interface()得到对应的value
    for i := 0; i < getType.NumField(); i++ {
        field := getType.Field(i)
        value := getValue.Field(i).Interface()
        fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
    }

    // 获取方法
    // 1. 先获取interface的reflect.Type,然后通过.NumMethod进行遍历
    for i := 0; i < getType.NumMethod(); i++ {
        m := getType.Method(i)
        fmt.Printf("%s: %v\n", m.Name, m.Type)
    }
}

运行结果:
get Type is : User
get all Fields is: {1 Allen.Wu 25}
Id: int = 1
Name: string = Allen.Wu
Age: int = 25
ReflectCallFunc: func(main.User)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题