全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang获取指针指向类型_结合reflect.Indirect操作

在 Go 中,用 reflect.Indirect 配合 reflect.ValueOf 可安全获取指针指向的实际类型,它递归解引用多级指针或接口,返回非指针非接口的 reflect.Value,再调用 .Type() 得到底层类型;对非指针值原样返回,nil 指针返回无效 Value 需检查。

在 Go 中,获取指针指向的**实际类型**(而非指针类型本身),常用 reflect.Indirect 配合 reflect.TypeOfreflect.ValueOf。关键在于:指针可能多层嵌套(如 **int),Indirect 会递归解引用直到得到非指针值,返回其 reflect.Typereflect.Value

用 reflect.Indirect 获取指针指向的 Type

reflect.Indirect 接收一个 reflect.Value,若该值是接口或指针类型,它会持续解引用,直到得到一个非指针、非接口的值(或 nil)。之后可调用 .Type() 得到最终类型。

  • 直接对指针变量调用 reflect.TypeOf(v) 返回的是 *T 类型;要得到 T,需先转为 ValueIndirect
  • reflect.Indirect 对非指针值(如 int、struct 值)会原样返回,安全可用
  • 若传入 nil 指针,Indirect 返回零值 reflect.Value.IsValid() == false),需检查

典型用法示例

以下代码演示如何从任意指针(包括多级)安全提取底层类型名:

func getUnderlyingType(v interface{}) string {
    val := reflect.ValueOf(v)
    if !val.IsValid() {
        return "invalid"
    }
    indirectVal := reflect.Indirect(val)
    if !indirectVal.IsValid() {
        return "nil pointer"
    }
    return indirectVal.Type().String()
}

// 使用
var i int = 42
p := &i
pp := &p
fmt.Println(getUnderlyingType(p))  // "int"
fmt.Println(getUnderlyingType(pp)) // "int"
fmt.Println(getUnderlyingType(42)) // "int"(非指针也兼容)

与 reflect.TypeOf 的区别和配合

reflect.TypeOf 只做静态类型检查,不处理运行时解引用;reflect.Indirect 是运行时操作,依赖 reflect.Value

  • reflect.TypeOf(&i)*int
  • reflect.Indirect(reflect.ValueOf(&i)).Type()int
  • 若想同时支持值和指针输入,统一用 reflect.ValueOf(x) 后接 Indirect 最稳妥

注意事项与常见坑

实际使用中容易忽略这些细节:

  • Indirect 不改变原始变量,只返回新 Value;如需修改原指针指向的值,要用 .Addr().Interface().Set* 方法
  • 对未导出字段的结构体指针,Indirect 能拿到类型,但无法读写字段(反射权限限制)
  • 接口类型(interface{})传入后,ValueOf 得到的是接口内部存储的值,Indirect 会对其内部值解引用(如果它是指针)


# go  # golang  # 区别  # 结构体  # 递归  # int  # 指针  # 接口  # 指针类型  # Struct  # Interface  # nil  # typeof  # 的是  # 它是  # 要用  # 会对  # 要得  # 而非  # 如需  # 它会  # 只做 


相关文章: 韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  详解jQuery停止动画——stop()方法的使用  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在云主机上快速搭建多站点网站?  建站之星上传入口如何快速找到?  C#如何在一个XML文件中查找并替换文本内容  建站之星图片链接生成指南:自助建站与智能设计教程  如何在建站宝盒中设置产品搜索功能?  建站主机解析:虚拟主机配置与服务器选择指南  网站图片在线制作软件,怎么在图片上做链接?  香港服务器选型指南:免备案配置与高效建站方案解析  建站之星下载版如何获取与安装?  完全自定义免费建站平台:主题模板在线生成一站式服务  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星北京办公室:智能建站系统与小程序生成方案解析  建站主机选购指南与交易推荐:核心配置解析  如何快速选择适合个人网站的云服务器配置?  如何选择PHP开源工具快速搭建网站?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  Android自定义listview布局实现上拉加载下拉刷新功能  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  制作公司内部网站有哪些,内网如何建网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何快速搭建高效可靠的建站解决方案?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何通过山东自助建站平台快速注册域名?  教学论文网站制作软件有哪些,写论文用什么软件 ?  制作网站的模板软件,网站怎么建设?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  大型企业网站制作流程,做网站需要注册公司吗?  如何通过wdcp面板快速创建网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  网站企业制作流程,用什么语言做企业网站比较好?  如何挑选高效建站主机与优质域名?  如何在IIS中新建站点并配置端口与IP地址?  建站上市公司网站建设方案与SEO优化服务定制指南  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  如何高效生成建站之星成品网站源码?  七夕网站制作视频,七夕大促活动怎么报名?  网页设计网站制作软件,microsoft office哪个可以创建网页?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在腾讯云服务器上快速搭建个人网站?  建站主机选购指南:核心配置与性价比推荐解析  如何在景安云服务器上绑定域名并配置虚拟主机?  网站app免费制作软件,能免费看各大网站视频的手机app?  山东网站制作公司有哪些,山东大源集团官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。