• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go反射

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

go 反射

反射:可以在运行时动态获取变量的相关信息

import (“reflect”)

  • reflect.TypeOf,获取变量的类型,返回reflect.Type类型
  • reflect.ValueOf,获取变量的值,返回reflect.Value类型
  • reflect.Value.Kind,获取变量的类别,返回一个常量
  • reflect.Value.Interface(),转换成interface{}类型

package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Name  string
	Age   int
	Score float32
}

func test(b interface{}) {
	t := reflect.TypeOf(b)
	fmt.Println(t)

	v := reflect.ValueOf(b)
	k := v.Kind()
	fmt.Println(k)

	iv := v.Interface()
	stu, ok := iv.(Student)
	if ok {
		fmt.Printf("%v %T\n", stu, stu)
	}
}

func testInt(b interface{}) {
	val := reflect.ValueOf(b)

	val.Elem().SetInt(100)

	c := val.Elem().Int()
	fmt.Printf("get value  interface{} %d\n", c)
	fmt.Printf("string val:%d\n", val.Elem().Int())

}

func main() {
	var a Student = Student{
		Name:  "stu01",
		Age:   18,
		Score: 92,
	}
	test(a)

	var b int = 1
	b = 200
	testInt(&b)
	fmt.Println(b)

}

 

获取变量的值

  • reflect.ValueOf(x).Float() 
  • reflect.ValueOf(x).Int()
  • reflect.ValueOf(x).String()
  • reflect.ValueOf(x).Bool()

改变变量的值

  • reflect.Value.SetXX相关方法
  • reflect.Value.SetFloat(),设置浮点数
  • reflect.Value.SetInt(),设置整数
  • reflect.Value.SetString(),设置字符串

用反射操作结构体

  • reflect.Value.NumField()获取结构体中字段的个数
  • reflect.Value.Method(n).Call来调用结构体中的方法
package main

import (
	"fmt"
	"reflect"
)

type NotknownType struct {
	s1 string
	s2 string
	s3 string
}
func (n NotknownType) String() string {
	return n.s1 + "-" + n.s2 + "-" + n.s3
}
var secret interface{} = NotknownType{"Ada", "Go", "Oberon"}

func main() {
	value := reflect.ValueOf(secret) // <main.NotknownType Value>
	typ := reflect.TypeOf(secret)    // main.NotknownType
	fmt.Println(typ)

	knd := value.Kind() // struct
	fmt.Println(knd)

	for i := 0; i < value.NumField(); i++ {
		fmt.Printf("Field %d: %v\n", i, value.Field(i))
		//value.Field(i).SetString("C#")
	}

	results := value.Method(0).Call(nil)
	fmt.Println(results) // [Ada - Go - Oberon]
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言学习(十二)Go 语言范围、Go 语言接口发布时间:2022-07-10
下一篇:
让我们一起Go(八)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap