Golang 中的反射,并用来获取数据类型

Go语言提供了一种机制在运行中获取某个变量的类型,获取或修改变量的值,调用变量的方法。

示例代码如下

1. 使用 x.(type)获取变量类型

package mainimport "strconv"
//StrPrint 将几种已知数据类型转化为 string
func StrPrint(x interface{}) string {// 表示具有string方法的接口type stringer interface {String() string}switch x := x.(type) {case stringer:return x.String()case string:return xcase int:return strconv.Itoa(x)case bool:if x {return "true"}return "false"default:return "???"}
}func main() {StrPrint(2333)
}

2. 通过 reflect.Value 获取变量类型

通过 reflect.Value 判断变量类型,并转换成 string

package formatimport ("reflect""strconv"
)func Any(value interface{}) string {return formatAtom(reflect.ValueOf(value))
}
// formatAtom 将变量转为string
func formatAtom(v reflect.Value) string {switch v.Kind() {case reflect.Invalid:return "invalid"case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:return strconv.FormatInt(v.Int(), 10)case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:return strconv.FormatUint(v.Uint(), 10)case reflect.Float32, reflect.Float64:return strconv.FormatFloat(v.Float(), 'f', -1, 64)case reflect.Complex64, reflect.Complex128:return strconv.FormatComplex(v.Complex(), 'f', -1, 128)case reflect.Bool:return strconv.FormatBool(v.Bool())case reflect.String:return strconv.Quote(v.String())case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map:return v.Type().String() + " 0x" + strconv.FormatUint(uint64(v.Pointer()), 16)default:return v.Type().String() + " value"}
}

3.使用类型断言将变量转换为特定类型

value, ok := x.(T)
package mainimport ("fmt"
)func main() {var x interface{}x = 2333value, ok := x.(int)fmt.Print(value, ",", ok)
}

输出结果:

2333,true

4. 使用反射获取一个结构体的字段信息

package mainimport ("fmt""reflect"
)type Person struct {Name stringAge  int
}func main() {p := Person{"Alice", 25}// 获取类型信息t := reflect.TypeOf(p)fmt.Println("Type:", t)// 获取字段信息for i := 0; i < t.NumField(); i++ {field := t.Field(i)fmt.Println("Field:", field.Name, field.Type)}
}

输出结果:

Type: main.Person
Field: Name string
Field: Age int

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放</title><script src"ThreeJS/three.js"></script><…

CentOS 7 安装Jdk 配置环境变量

在CentOS 7操作系统中&#xff0c;安装JDK并配置环境变量的具体步骤如下&#xff1a; 第一步、需要检查系统是否自带JDK&#xff0c;并删除已有的JDK。 第二步、下载JDK8或其它版本的安装包&#xff0c;并解压到一个新建的Java目录中。 第三步、配置环境变量。将JAVA_HOME变量设…

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因&#xff0c;该软件可以帮助您恢复…

你还在找PDF转Word的工具?一个好软件推荐,赶紧查收!

前言 前段时间朋友跟小白吐槽&#xff1a;为啥PDF文件转Word文档的工具都要收费&#xff1f; 因为他们都收费啊。 小白之前找了很多类似有这种功能的工具&#xff0c;都发现&#xff1a;不但收费&#xff0c;可能还附带全家桶&#xff0c;而且还有……广告&#xff01; 在一次…

Pytest插件“pytest-selenium” - 让自动化测试更简洁

在现代Web应用的开发中,自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具,以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例,助你轻松进入无忧的Web应用测试之…

中文词向量训练-案例分析

1 数据预处理&#xff0c;解析XML文件并分词 #!/usr/bin/env python # -*- coding: utf-8 -*- # process_wiki_data.py 用于解析XML&#xff0c;将XML的wiki数据转换为text格式 import logging import os.path import sys from gensim.corpora import WikiCorpus import jieba…

phpStorm 设置终端为git bash

环境&#xff1a; windows , PhpStorm 2022 为自己的终端配置git样式的使用&#xff0c; 默认终端样式 一、打开设置&#xff0c;选择git bin 二、重新打开终端 不加--login -i 的终端 加了--login -i 的终端 最重要的一点是什么&#xff0c;他可以像mac一样支持 ctrlv 复…

【Vue3+Ts项目】硅谷甄选 — 菜单权限+按钮权限

一、菜单权限 1.1 路由拆分 将项目路由拆分为&#xff1a; 静态路由&#xff1a;login、404、home、screen异步路由&#xff1a;权限管理&#xff08;包含三个子路由&#xff09;、商品管理&#xff08;包含四个子路由&#xff09;任意路由&#xff1a;任意路由 src/router/r…

「优选算法刷题」:有效三角形的个数

一、题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示例 2: 输入: nums [4,2,3,4] 输出: 4二、思路解析 这道…

扎克伯格宣布将购买35万个GPU

Meta公司马克.扎克伯格1月18日在Instagram上发表文章称&#xff0c;该公司正在加强人工智能研究团队的力量&#xff0c;并在充实AI基础设施“弹药库“&#xff0c;计划在今年年底前向芯片设计商英伟达购买35万个H100 GPU芯片&#xff0c;从而使该公司的GPU总量达到约60万个&…

迪菲赫尔曼密钥交换详细介绍

由于这个问题涉及到一个“原根”的概念&#xff0c;首先先简单介绍一下原根是什么&#xff1a; 原根是数论中的一个概念&#xff0c;它在模运算中具有特殊性质。假设有一个正整数m和另一个整数a&#xff0c;如果a与m互质&#xff08;即它们的最大公约数为1&#xff09;&#x…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…

线性规划案例分享

今天想写一个最优传输的简单实现&#xff0c;结果学歪了&#xff0c;学到线性规划去了&#xff0c;这里我发现了一个宝藏网站 虽然是讲计量经济的&#xff0c;但是里面提供的公式和代码我很喜欢&#xff0c;有时间可以好好读一下 https://python.quantecon.org/lp_intro.html …

【Guava笔记01】Guava Cache本地缓存的常用操作方法

这篇文章,主要介绍Guava Cache本地缓存的常用操作方法。 目录 一、Guava Cache本地缓存 1.1、引入guava依赖 1.2、CacheBuilder类 1.3、Guava-Cache使用案例

如何一键部署本地Java项目到服务器上

一、背景 我开发了一个Java代码&#xff0c;现在想部署到服务器上&#xff0c;当然可以使用Jenkins部署&#xff0c;但是Jenkins配置和维护成本比较高&#xff0c;所以我今天分享的是轻量级的一键部署脚本 演示&#xff1a;本地Window的Java代码 -> Vmware虚拟机Centos7上…

面试题:RabbitMQ 有哪几种消息模式?

文章目录 前言核心组成Rabbitmq 消息模式3.1 Simple 模式ProductorCustomer 3.2 Fanout 模式ProductorCustomer 3.3 Direct 模式Productor 3.4 Topic 模式Productor 3.5 Work 模式3.5.1 轮询分发ProductorWorker1 3.5.2 公平分发Worker1 防止消息丢失机制4.1 消息确认4.2 持久化…

在WIN从零开始在QMUE上添加一块自己的开发板(一)

文章目录 一、前言二、源码编译&#xff08;一&#xff09;安装Msys2&#xff08;二&#xff09;配置GCC工具链&#xff08;三&#xff09;安装QEMU构建依赖&#xff08;四&#xff09;下载编译QEMU源码 二、QUME编程基础&#xff08;一&#xff09;QOM机制&#xff08;二&…

十种较流行的网络安全框架及特点分析

文章目录 前言一、CIS关键安全控制二、COBIT三、CSA云控制矩阵&#xff08;CCM&#xff09;四、NIST网络安全框架&#xff08;CSF&#xff09;五、TARA六、SOGP七、OCTAVE八、ISO / IEC 27001:2022九、HITRUST CSF十、PCI DSS 前言 网络安全框架主要包括安全控制框架&#xff…

LabVIEW振动筛螺栓松动故障诊断

LabVIEW振动筛螺栓松动故障诊断 概述&#xff1a;利用LabVIEW解决振动筛螺栓松动的故障诊断问题。通过集成的方法&#xff0c;不仅提高了故障检测的准确性&#xff0c;还优化了维护流程&#xff0c;为类似的机械设备故障提供了可靠的解决方案。 由于工作条件复杂&#xff0c;…