首页 > 其他分享 >golang reflect 常见示例

golang reflect 常见示例

时间:2024-05-30 12:21:39浏览次数:20  
标签:reflect log 示例 ValueOf golang TypeOf Printf type

reflect是golang中元编程的能力体现。

需要注意的是,reflect尽量不用,有性能问题,也有避免滥用的考虑。

package main

import (
	"log"
	"reflect"
)

type A struct {
	a int
	b string
	c bool
}

// 实验reflect的相关函数
func main() {
	typeValue()
	callFunc()
}

func others() {
	// 类型赋值
	// newTValue.Elem().FieldByName(newTTag).Set(tValue)

	// 依据 kind 分支
	// reflect.TypeOf(a).Kind()
	// case reflect.Int:
	// case reflect.String:
}

// 动态调用函数
func callFunc() {
	o := &A{}

	in := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf("xyz"), reflect.ValueOf(true)}
	done := reflect.ValueOf(o).MethodByName("Create").Call(in)
	// 类型断言: done[0].Interface().(bool)
	log.Printf("called Created and returned: %v obj: %v", done[0].Interface().(bool), o)
}
func (o *A) Create(a int, b string, c bool) bool {
	o.a = a
	o.b = b
	o.c = c
	return true
}

// 使用reflect实现对象及成员的类型与数值获取
func typeValue() {
	// 声明一个结构体对象
	x := A{a: 1, b: "xyz", c: true}

	// 获取结构体的类型
	log.Printf("type of x: %T", x)
	log.Printf("type of x: %s", reflect.TypeOf(x))
	log.Printf("type of x: %s", reflect.TypeOf(x).String())

	// 获取结构体对象的值
	log.Printf("value of x: %v", x)
	log.Printf("value of x: %v", reflect.ValueOf(x))
	log.Printf("value of x: %v", reflect.ValueOf(x).String())

	// 获取结构体成员的类型和值
	log.Printf("elem num of x: %d", reflect.TypeOf(x).NumField())
	log.Printf("elem num of x: %d", reflect.ValueOf(x).NumField())
	log.Printf("x elem 0: name: %s type: %s, value: %v",
		reflect.TypeOf(x).Field(0).Name,
		reflect.TypeOf(x).Field(0).Type,
		reflect.ValueOf(x).Field(0))

	// 获取结构体成员的类型和值
	log.Printf("x elem 1: name: %s type: %s, value: %v",
		reflect.TypeOf(x).Field(1).Name,
		reflect.ValueOf(x).Field(1).Type(),
		reflect.ValueOf(x).Field(1))
}

参考repo: https://github.com/zongzw-learn/learn-go/blob/master/syntax/reflect/main.go

标签:reflect,log,示例,ValueOf,golang,TypeOf,Printf,type
From: https://www.cnblogs.com/zongzw/p/18222112

相关文章

  • 通栏中不定数量的图片/轮播自适应宽高的简单示例
    最近接到一个需求,在一个页面会有多个通栏,每个通栏中会有不固定数量的图片或轮播图,要求各图片/轮播要同等比例自适应宽高,写成通用代码。示意图:光是图片好说,其中有swiper就会比较麻烦。代码:<divclass="container"><divclass="zt_banner"><divclass="swiper">......
  • Python-使用OpenCV(二)_第一个示例程序
    1、创建项目2、创建代码importcv2#加载图片image=cv2.imread("C:\\Users\\Administrator\\Pictures\\Screenshots\\20240311220733.png")#显示图片cv2.imshow("Image",image)#等待任意键被敲击cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()3、结......
  • golang errgroup 的作用
     errgroup是Go中用于并发控制和错误处理的一个工具,提供了一种方便的方式来协调多个goroutine。它允许你在一个组中运行多个goroutine,并等待它们全部完成,同时收集和返回第一个发生的错误。它的主要作用包括:同步:errgroup.Group提供了一个Wait方法,这个方法会阻塞调......
  • golang errgroup 的超时检测
     > golangerrgroup的作用.errgroup的超时检测通常是一种事后得到结果的方式。 errgroup本身并不直接支持超时控制,而是依赖于与之关联的context.Context来实现超时和取消功能。 当context超时时,它会关闭Done通道,这将通知errgroup中的协程。 errgroup的Wait方法在检......
  • golang kafka例子
    packagemain//生产者代码import( "fmt" "github.com/IBM/sarama" "time")//基于sarama第三方库开发的kafkaclientvarbrokers=[]string{"127.0.0.1:9092"}vartopic="hello_kafka0"//同步消息模式funcsyncProducer(conf......
  • YAML示例:创建daemonset
    apiVersion:apps/v1kind:DaemonSetmetadata:name:test-ds-1namespace:sjlabels:k8s-app:arksec-ds-1spec:selector:matchLabels:name:arksec-ds-1template:metadata:labels:name:arksec-ds-1spec:nodeSelector:#只让它在指定hostname的节点上创建,注意,......
  • css通过子元素选择父元素的实现示例
    在CSS中,直接通过子元素选择其父元素并不直接支持,因为CSS的选择器是从上到下(从父元素到子元素)进行选择的,而不是相反。但是,你可以使用其他方法或技术来间接实现这一效果,比如使用JavaScript、jQuery或其他脚本语言,或者通过调整你的HTML结构和CSS样式来达到类似的效果。不过,我可以给......
  • 干货收藏!Calico的BGP RouteReflector策略实践
    本文分享自华为云社区《CalicoBGPRouteReflector策略实践》,作者:可以交个朋友。一背景容器网络组件Calico支持多种后端模式,有Overlay的IPIP、Vxlan模式,也有Underlay纯路由的BGP模式。相比于Overlay网络模型,Underlay网络具有更高的数据面转发性能。同时在纯路由模式下,也有两种......
  • Golang中的三种指针
    三种类型的指针:类型用途备注普通类型指针传递对象的地址,不能做指针运算uintptr作为一段内容的首地址,可以做指针运算,GC不把uintptr当指针,uintptr无法持有对象。uintptr类型的目标会被回收。unsafe.Pointer不能做指针运算,可以用做在不同数据类型指针间转......
  • 使用Python进行数据分析与可视化的简单示例
    使用Python进行数据分析与可视化的简单示例。在这个示例中,我们将使用Pandas库进行数据分析,并使用Matplotlib库进行数据可视化。首先,假设我们有一个包含销售数据的CSV文件(sales_data.csv),其中包含以下列:日期(Date)、销售额(Sales)和产品类别(Product_Category)。CSV文件的内容可能......