golang reflect demo讲解

2024-05-27 21:48
文章标签 讲解 golang demo reflect

本文主要是介绍golang reflect demo讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Demo

这里引用了第三方包

go get github.com/influxdata/toml
go install github.com/influxdata/toml

就可以直接使用第三方代码了,可以修改,也可以打断点。

package mainimport ("fmt""reflect""github.com/influxdata/toml"
)type testInterface interface {
}type testStruT struct {TestFieldA stringTestFieldB string `testFieldB:"b"`TestFieldC string `testFieldC:"ccc"`
}func testProcStruct(v interface{}) {fmt.Printf("1 v =                       %v\n", v)rv := reflect.ValueOf(v)fmt.Printf("2 rv = reflect.ValueOf(v) = %v\n", rv)fmt.Printf("3 rv.Kind() =               %v\n", rv.Kind())elem := rv.Elem()fmt.Printf("4 elem = rv.Elem() =        %v\n", elem)fmt.Printf("5 elem.Kind() =             %v\n", elem.Kind())/*判断改结构体是否有名为TestFieldA、TESTFIELDA的字段,若找不到found为false.在FindField会将传入的字符串格式化判断(可以看源码)*/fv, fieldName, found := toml.FindField(elem, "testFieldA")fmt.Printf("6 fv = %v, fieldName = %v, found = %v\n", fv, fieldName, found)
}func testPorcMap(v interface{}) {fmt.Printf("7 v =                       %v\n", v)rv := reflect.ValueOf(v)fmt.Printf("8 rv = reflect.ValueOf(v) = %v\n", rv)fmt.Printf("9 rv.Kind() =               %v\n", rv.Kind())//elem := rv.Elem()   若Kind是Map,这里会PanicrvType := rv.Type()fmt.Printf("10 rvType =                 %v\n", rvType)fmt.Printf("11 rvType.Elem() =          %v\n", rvType.Elem())mv := reflect.New(rvType.Elem())fmt.Printf("12 mv =                     %v\n", mv)elem := mv.Elem()fmt.Printf("13 elem =                   %v\n", elem)fmt.Printf("14 elem.Type() =            %v\n", elem.Type())fmt.Printf("15 elem.Kind() =            %v\n", elem.Kind())fmt.Printf("16 v =                      %v\n", v)rv.SetMapIndex(reflect.ValueOf("testKey2"), elem) //  修改键值fmt.Printf("17 v =                      %v\n", v)
}func main() {//  匿名函数creator := func() testInterface {return &testStruT{TestFieldA: "testValue1",}}testInter := creator()testProcStruct(testInter)testStruct2 := testStruT{TestFieldC: "testValue2",}testStruct3 := testStruT{TestFieldB: "testValue3",}testMap := map[string]testStruT{}testMap["testKey2"] = testStruct2testMap["testKey3"] = testStruct3testPorcMap(testMap)
}
运行结果
[Running] go run "c:\Code\Go\src\study\main.go"
1 v =                       &{testValue1  }
2 rv = reflect.ValueOf(v) = &{testValue1  }
3 rv.Kind() =               ptr
4 elem = rv.Elem() =        {testValue1  }
5 elem.Kind() =             struct
6 fv = testValue1, fieldName = TestFieldA, found = true
7 v =                       map[testKey2:{  testValue2} testKey3:{ testValue3 }]
8 rv = reflect.ValueOf(v) = map[testKey2:{  testValue2} testKey3:{ testValue3 }]
9 rv.Kind() =               map
10 rvType =                 map[string]main.testStruT
11 rvType.Elem() =          main.testStruT
12 mv =                     &{  }
13 elem =                   {  }
14 elem.Type() =            main.testStruT
14 v =                      map[testKey2:{  testValue2} testKey3:{ testValue3 }]
15 v =                      map[testKey2:{  } testKey3:{ testValue3 }][Done] exited with code=0 in 3.769 seconds

这篇关于golang reflect demo讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008683

相关文章

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

目录 一、二叉树的定义 二、二叉树的形态 三、二叉树的性质 四、二叉树的存储 五、二叉树的创建与遍历(递归) 六、二叉树实现 创建二叉树 展示二叉树 1、计算数的高度 2、计算数的叶子数量 3、计算数的宽度 4、层次遍历 5、前序遍历 递归写法 非递归写法 6、中序遍历 递归写法 非递归写法 7、后序遍历 递归写法 非递归写法 8、输出根节点到所有叶

springboot+vue+mybatis旅游管理+PPT+论文+讲解+售后

随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.旅游管理系统将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本文以jsp为开发技术,实现了一个旅游网站系统。旅游网站系统的主要使用者分为管理员和用户,管理员权限如下;主页、个人中心、景点分类管理、景点信息

React18中各种Hooks用法总结( 内附案例讲解)

React中各种Hooks用法总结 内附案例讲解 一、useState useState 是一个 React Hook,它允许你向组件添加一个 状态变量。 import React, { FC, memo, useState } from 'react'import { MainContainer } from './style'interface IProps {children?:

视频讲解|【双层模型】分布式光伏储能系统的优化配置方法

1 主要内容 该讲解视频对应的程序链接为【双层模型】分布式光伏储能系统的优化配置方法,模型参考《分布式光伏储能系统的优化配置方法》,分为上下层求解方式,上层采用粒子群算法确定储能的选址和容量方案,以全年购电成本、网络损耗、光伏运行成本、储能充放电和投资成本为目标;下层采用混合整数规划算法(默认求解器为cplex,也可替换成gurobi),以IEEE33节点配电网为研究对象,通过二阶锥模型求解,以

模拟算法讲解

模拟算法是一种基于实际情况模拟的算法,通过模拟现实世界中的系统或过程,来研究它们的性质和行为。模拟算法可以用于解决各种问题,包括物理模拟、经济模拟、社会模拟等。 模拟算法的基本步骤包括: 定义问题:明确需要模拟的系统或过程,并确定模拟的目标和约束条件。建立模型:根据问题定义,设计合适的模型来描述系统或过程的组成和行为。收集数据:收集和整理与模型相关的数据,包括初始状态和影响模拟结果的参数。

Java环境变量配置中有关JAVA_HOME,path,Classpath含义的讲解

一:Path变量 Path变量是操作系统的,用以找寻相关命令的。例如ping这个命令,你能在控制行里打ping 127.0.0.1而有程序执行并正确返回结果,是因为Path变量包含C:\Windows\System32。你可以在Path中把C:\Windows\System32去掉,再使用ping命令,就会提示找不到ping命令。 这就像你在你的办公桌上工作,需要用到各种工具,如钢笔,

利用一个正则表达式的一个例子来讲解Java中的两种for循环。

package 正则表达式;public class Rudolph {public static void main(String[] args) {// TODO Auto-generated method stubString[] str = new String[]{"Rudolph","[rR]udolph","[rR][aeiou][a-z]ol.*","R.*"};for(Strin