go reflect的用法

go reflect的用法总结:1.go语言支持反射即reflect,核心包括两方面:类型(reflect.Type)、值(reflect.Value)2.reflect可以获取到变量、结构体的类型和值3.reflect可以根据类型(reflect.Type)新产生一个对象实验如下图代码如下:packagemainimport( “fmt” “reflect”)//自定义结构体typeUserstruct{ IDint32 Namestring…

总结:

1. go语言支持反射即reflect,核心包括两方面:类型(reflect.Type)、值(reflect.Value)

2. reflect  可以获取到变量、结构体的类型和值

3. reflect 可以根据类型(reflect.Type)新产生一个对象

 

实验如下图

go reflect的用法

代码如下:

package main

import (
	"fmt"
	"reflect"
)

// 自定义结构体
type User struct {
	ID   int32
	Name string
}
func (u User) GetName() string {
	return u.Name
}

// 接口:人
type Person interface {
	GetHP() int32
}
// 男人
type Man struct {
}
func (m Man) GetHP() int32 {
	return 100
}
// 女人
type Woman struct {
}
func (w Woman) GetHP() int32 {
	return 200
}

func main() {
			基本类型		//
	fmt.Println("整形")
	var a int = 555
	fmt.Println(reflect.TypeOf(a))
	fmt.Println(reflect.ValueOf(a)) // Valueof()就是取变量的值
	fmt.Println("")

	fmt.Println("字符串")
	fmt.Println(reflect.TypeOf("999"))
	fmt.Println(reflect.ValueOf("999")) // Valueof()就是取变量的值
	fmt.Println("")

	fmt.Println("数组")
	arr := []int32{1, 2, 3}
	fmt.Println(reflect.TypeOf(arr))
	fmt.Println(reflect.ValueOf(arr)) // Valueof()就是取变量的值
	fmt.Println("")

		 	自定义结构体	 //
	fmt.Println("自定义结构体")
	// 自定义结构体
	user1 := User{}
	fmt.Println(reflect.TypeOf(user1))
	fmt.Println(reflect.ValueOf(user1))

	// 根据类型new一个结构体, 步骤如下
	// 1. 得到类型reflect.Type
	// 2. 根据类型new一个reflect.Value,再转为Interface
	// 3. Interface转为相应的对象指针
	userTy := reflect.TypeOf(user1)
	newInterface := reflect.New(userTy).Interface()
	newUser := newInterface.(*User)
	newUser.ID = 123
	newUser.Name = "123"
	fmt.Printf("根据reflect.Type新建的User对象内容:%v", newUser)

	// 自定义结构体的函数
	fmt.Println(reflect.TypeOf(user1).MethodByName("GetName"))  // 返回该函数的形式
	fmt.Println(reflect.ValueOf(user1).MethodByName("GetName")) // 返回该函数在内存中的真实地址
	fmt.Println("")

		 	接口	 //
	fmt.Println("自定义结构体")
	man := Man{}
	fmt.Println(reflect.TypeOf(man))  // 返回该结构体定义的名字
	fmt.Println(reflect.ValueOf(man)) // 返回{}
	fmt.Println("")

	// 根据类型新建一个Woman对象
	womanTy := reflect.TypeOf(Woman{}) // 这里是根据一个空的Woman对象,得到其类型
	newWomanInterface := reflect.New(womanTy).Interface()
	newWoman := newWomanInterface.(*Woman)
	fmt.Printf("根据reflect.Type新建的newWoman对象内容:%v", newWoman)
	fmt.Println("")
}

 

今天的文章go reflect的用法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30510.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注