Go 语言学习之 reflect

简介: Go 语言学习之 reflect

01

概念


在 Go 语言中,reflect 可以用来在运行期间获取对象的类型信息和内存结构,reflect 操作所需的全部信息都源自接口变量,接口变量除了存储自身类型外,还会保存实际对象的类型数据。reflect 通过 TypeOf 和 ValueOf 函数,将任何传入的对象转换为接口类型。


02

使用反射获取对象的类型


TypeOf returns the reflection Type that represents the dynamic type of i. If i is a nil interface value, TypeOf returns nil.


func reflect.TypeOf(i interface{}) reflect.Type
  • 获取对象的类型信息:

640.png

输出结果:

go run main.go 
A int


需要注意的是,Name 是真实类型,Kind 是真实类型的基础结构类别。在类型判断时要注意区分。


  • 传入的参数对象区分基类型和指针类型


示例代码:

640.png

输出结果:

go run main.go 
int *int false int
int ptr
true


代码中,我们使用 Elem 方法返回指针的基类型,此外,Elem 方法还可以返回数组、slice、map、chan 的基类型。


03

使用反射操作 struct


  • 遍历结构体遍历结构体的字段,需要先获取结构体指针的基类型示例代码:
  • 640.png
  • 输出结果:
go run main.go 
2
name string
score int
  • 提取 struct tag一般用于 ORM 映射,数据格式验证。示例代码:
  • 640.png
  • 输出结果:
go run main.go 
name user_name
age user_age


04

使用反射获取和修改对象的值


ValueOf returns a new Value initialized to the concrete value stored in the interface i. ValueOf(nil) returns the zero Value.


func reflect.ValueOf(i interface{}) reflect.Value


示例代码:

640.png

输出结果:

go run main.go 
v:{ 0} type:main.animal kind:struct
v:{kity 0} type:main.animal kind:struct

通过代码演示,发现 ValueOf 可以获取对象的值。


我们知道修改对象的变量,需要传入指针,但是因为接口变量存储的指针是不可以寻址和设置变量的,所以还需要通过 Elem 获取目标对象。


非导出字段的值不能修改。


05

使用反射动态调用方法


  • 固定参数,使用 Call,只需按照参数列表传参即可。示例代码:
  • 640.png
  • 输出结果:
go run main.go 
姓名:frank 积分:88
  • 可变参数,使用 CallSlice,仅需一个 []interface{} 即可。示例代码:
  • 640.png
  • 输出结果:
go run main.go 
[I am lucy, My hobby is [singing dancing]]
[I am lucy, My hobby is [singing dancing]]



目录
相关文章
|
10月前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
618 1
|
9月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
429 2
|
10月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
289 4
|
11月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
647 1
|
10月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
349 0
|
11月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
649 0
|
11月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
469 0
|
11月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
502 0
|
11月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
770 0
|
11月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。

热门文章

最新文章