Go语言学习笔记 --- reflection

Go语言--反射(reflect) 0 反射的概念 反射是指计算机程序在运行时(runtime)可以访问、检测和修改本身状态或行为的一种能力。通俗地将,反射就是程序能够在运行时动态地查看自己的状态,并且允许修改自身的行为。 ... 阅读详情

学习笔记根据 无闻 go语言基础教程 整理

reflection

  • 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地
  • 反射使用TypeOf 和 ValueOf 函数从接口中获取目标对象信息
  • 反射会将匿名字段作为独立字段(匿名字段本质)
  • 想要利用反射修改对象状态,前提是interface.data 是settable, 即 pointer-interface
  • 通过反射可以”动态调用方法”
  • 示例代码:
package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Id int
    Name string
    Age int
}

type Manager struct {
    User
    title string
}

func Set(o interface{}) {
    v := reflect.ValueOf(o)

    if v.Kind() == reflect.Ptr && !v.Elem().CanSet() {
        fmt.Println("XXX")
        return
    } else {
        v = v.Elem()
    }

    f := v.FieldByName("Name")
    if !f.IsValid() {
        fmt.Println("Bad")
        return
    }
    if f.Kind() == reflect.String {
        f.SetString("Good")
    }

}

func (u User) Hello() {
    fmt.Println("Hello world")
}

func (u User) SayHello(name string) {
    fmt.Println("Hello", name, ", my name is ", u.Name)
}

func Info(o interface{}) {
    t := reflect.TypeOf(o) // 获得接收的接口类型
    fmt.Println("t:", t) // t: main.User
    fmt.Println("Type:", t.Name()) // Type: User

    // 根据传入参数判断非指针类型不能继续操作
    if k := t.Kind(); k != reflect.Struct {
        fmt.Println("不能传递&u,这样的指针类型")
        return
    }

    v := reflect.ValueOf(o)
    fmt.Println("Fields:")
    for i:= 0; i < t.NumField(); i++ {
        f := t.Field(i)
        val := v.Field(i).Interface() // 通过这种方法取出字段所对应的值
        fmt.Printf("%6s: %v = %v\n", f.Name, f.Type, val)
    }
    /**
    // for循环输出
    Fields:
        Id: int = 1
      Name: string = OK
       Age: int = 12

     */

      fmt.Println("====================")

      for i:=0; i<t.NumMethod(); i++ {
        m := t.Method(i)
        fmt.Printf("%6s: %v\n", m.Name, m.Type)
      }

      /**
        // 打印出的结果:
        Hello: func(main.User)
      */
}



func main() {
    test1()
    test2()
    test3()
    test4()
    test5()
    test6()
}

func test1() {
    u := User{1, "OK", 12}
    Info(u)
    // Info(&u) // 如果传入这样的值,就会终止执行
}

// 测试匿名字段
func test2() {
     m := Manager {User: User{1, "OK", 12}, title:"123"}
     t := reflect.TypeOf(m)

     fmt.Printf("%#v\n", t.Field(0))
     fmt.Println("=================")
     fmt.Printf("%#v\n", t.Field(1))
     fmt.Println("-----------------")
     fmt.Printf("%#v\n", t.FieldByIndex([]int{0,0})) // 通过传递进去的slice,来取匿名字段
     fmt.Println()
     fmt.Printf("%#v\n", t.FieldByIndex([]int{0,1})) // 通过传递进去的slice,来取匿名字段
   fmt.Println()

     /*打印出的结果:*/
     /*
     reflect.StructField{Name:"User", PkgPath:"", Type:(*reflect.rtype)(0x4a6380), Tag:"", Offset:0x0, Index:[]int{0}, Anonymous:true}
     =================
   reflect.StructField{Name:"title", PkgPath:"main", Type:(*reflect.rtype)(0x4987e0), Tag:"", Offset:0x20, Index:[]int{1}, Anonymous:false}
   -----------------
   reflect.StructField{Name:"Id", PkgPath:"", Type:(*reflect.rtype)(0x4987e0), Tag:"", Offset:0x0, Index:[]int{0}, Anonymous:false}

   reflect.StructField{Name:"Name", PkgPath:"", Type:(*reflect.rtype)(0x498ea0), Tag:"", Offset:0x8, Index:[]int{1}, Anonymous:false}
      */
}

// 使用reflect 修改基本类型的值
func test3() {
    x := 123
    v := reflect.ValueOf(&x)
    v.Elem().SetInt(999)
    fmt.Println(x) // 999
}

// 通过反射对接口对象中的值进行修改
func test4() {
    u := User{1, "OK", 12}
    Set(&u)
    fmt.Println(u) // {1 Good 12}
}

// 直接调用修改方法
func test5() {
    u := User{1, "OK", 12}
    u.SayHello("John") // Hello John , my name is  OK
}

// 通过reflect来调用方法
func test6() {
    u := User{1, "OK", 12}
    v := reflect.ValueOf(u)
  mv := v.MethodByName("SayHello")

  args := []reflect.Value{reflect.ValueOf("john")}
  mv.Call(args) // Hello john , my name is  OK
}
OpenCV计算机视觉实战(3)——计算机图像处理基础 本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。 阅读详情

相关推荐

WPS制作甘特图实操(带图超详细)

一、数据准备 图1 二、添加公式 在表格的E3处添加公式:=IF(C3>=G3,0,IF(C3+D3>=G3,G3-C3,D3)),点击该单元格的右下角。使鼠标箭头变“+”后下拉拖拽,复制该公式。F3处的公式为:=D3-E3,使用相同的拖拽方式复制公式应用,操作完毕如下图3. 图2 图3 三、插入图表 1、选中方框1内容,按住ctrl按键,继续选择2、3列的内容,点击插入全部图表中的条形图,选择2对应的图标样式,生成图6的样式。 点击图6中的3标尺,右击选择数据弹出图8,点击+号选择表格中

m0_49047167的博客 3万+

GO反射(reflect)

目录 reflect 获取变量类别 ValueOf Value.Set 结构体反射 反射获取结构体中的属性值和类型 更改结构体属性值 反射实现Tag原信息 函数反射 Value的Call()方法 方法反射 reflect 1. reflect.TypeOf,获取变量的类型,返回reflect.Type类型 2...

小柏ぁ的博客 2258

开关电源补偿设计避坑手册:为什么你的Buck电路总在轻载时振荡?

本文深入剖析了Buck电路在轻载时发生振荡的根本原因,并提供了专业的补偿设计避坑指南。文章指出,轻载下输出滤波器Q值飙升、DCM模式切换导致的小信号模型剧变是主要诱因,并详细对比了Type II与Type III补偿网络在宽负载范围内的表现差异。通过结合LTspice仿真与工程实践,指导工程师如何优化补偿环路设计,确保电源从满载到空载的全程稳定。

hadoop5ranger的博客 677

深入理解 go reflect - 反射基本原理

反射是这样一种机制,它是可以让我们在程序运行时(runtime)访问、检测和修改对象本身状态或行为的一种能力。比如,从一个变量推断出其类型信息、以及存储的数据的一些信息,又或者获取一个对象有什么方法可以调用等。反射经常用在一些需要同时处理不同类型变量的地方,比如序列化、反序列化、ORM等等,如标准库里面的。是一个接口,它代表了一个类型。我们可以通过来获取一个类型的对象。我们使用的目的通常是为了获取类型的信息,比如类型是什么、类型的名称、类型的字段、类型的方法等等。又或者最常见的场景:结构体中的json的。

BASK2312的博客 1280

基于vivado实现FFT/IFFT

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、实现的功能二、配置1.调用DDS的IP核2.调用FFT的IP核三、结果分析1.调用DDS的IP核2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、实现的功能 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任

qq_45600102的博客 1万+

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 920

Go 反射 reflect

Go 语言的reflect包是一个非常强大的工具,它允许程序在运行时检查和处理其他对象的结构。使用reflect,你可以获取类型的信息,调用方法,以及读写结构体字段,即使这些信息在编译时是未知的。

qq_39335595的博客 684

手把手调试AD9653的LVDS数据采集:从VIO抓波形到用F0/F8帧对齐的实战心得

本文详细介绍了AD9653高速ADC与Xilinx 7系列FPGA(如7z035)的LVDS数据采集调试实战经验。从硬件环境搭建、Vivado工具链配置到LVDS数据对齐技巧,重点分享了利用VIO抓取波形和使用F0/F8帧对齐的实用方法,帮助工程师快速解决高速数据采集系统中的信号完整性问题。

weixin_29169899的博客 705

go语言标准库之——反射reflect

reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。基于反射的代码是极其脆弱的,反射中的类型错误会在真正运行的时候才会引发panic,那很可能是在代码写完的很长时间之后。大量使用反射的代码通常难以理解。反射的性能低下,基于反射实现的代码通常比正常代码运行速度慢一到两个数量级。

General_zy的博客 2350

【连接器专题】 EIA-364 系列标准的完整列表

EIA-364 系列标准在电子工业中具有重要的地位,为电子连接器和互连系统的测试和验证提供了统一的、可操作的流程和方法,有助于提高电子产品的质量和可靠性,促进了电子工业的发展

一点硬件 2662

引文:当SVM转角遇上Copy-on-Write (COW)

本文分析了Linux内核中fork系统调用的Copy-on-Write(COW)机制实现原理。重点阐述了fork时父子进程共享物理页面、标记页表项为只读并在写操作时触发COW的流程,以及在SVM环境中通过MMU Notifier机制保持CPU和GPU页表同步的解决方案。文章详细描述了COW的三个阶段:初始共享、写入触发和页面复制,并说明了MMU Notifier的回调注册和处理流程,确保异构计算环境下内存一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 2675

GO语言学习笔记(十一、反射reflection)

反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和VuleOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字段本质) 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface 通过反射可以“动态”调用方法 对接口中的对象通过反射对...

分享AI、区块链技术及应用,未来已来 235

Vue.js + Element UI 实现会员管理系统:完整源码与详细教程|新手必看:用 Vue.js 和 Element UI 打造会员管理系统,完整代码解析|从零开始|后台管理系统|大学生期末大

总之,学习前端开发需要耐心和毅力,要保持对技术的热情和兴趣,不断学习和提升自己。通过实践项目、学习工具和框架、关注前端趋势等方式,你可以逐渐成为一名优秀的前端开发者。

南北极之间 1076

Go语言学习笔记(九)------接口(Interfaces)与反射(reflection)

一、接口定义 1.接口提供了一种方式来说明对象的行为:如果谁能搞定这件事,它就可以用在这儿。接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的),接口里也不能包含变量。通过如下格式定义接口: type Namer interface { // Namer 是一个接口类型 Method1(param_list) return_type Method2(...

Rcvisual的博客 820

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Golang-gRPC学习笔记,streamRPC,reflection,认证,拦截器

入门 RPC简介 RPC(Remote Procedure Call Protocol),远程调用协议。调用远程的函数实现功能。 广泛应用于分布式,微服务,解耦,跨语言通信等。RPC的目标就是把远程调用的过程透明化。 RPC把函数调用参数和返回值进行序列化,然后通过网络服务发送和接收。 gRPC简介 gRPC是google的开源的高可用的通用的RPC框架 gRPC使用protobuf作为接口定义语言和基础消息交换格式 gRPC服务方法 1.一元RPC(简单RPC) 客户端发送一个单独的请求,并且接收服务

随便记记笔记 3246

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Go语言学习笔记(一)------目录

做区块链项目,发现自己的Go基础还是比较差,一些基本的东西还是了解不多,所以我想重新过一下go语言,这个系列博客就是为了记录一下自己的学习路径,同时方便自己回顾,在此感谢大家的翻译《the way to go》和无闻大大。 笔记目录 Go语言学习笔记(一)------目录 Go语言学习笔记(二)------Go的基本结构和要素 Go语言学习笔记(三)------控制结构 Go语言学习笔记...

Rcvisual的博客 791

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

golang之reflection

反射就是程序能够在运行时检查变量和值,求出它们的类型。 reflect包实现运行时反射。 创建一个接收任何数据类型任何数值的查询string: func createQuery(q interface{}) string { } reflect.Type表示interface{}的具体类型,而reflect.Value表示它的具体值。reflect.TypeOf()和...

weixin_30722589的博客 151

Golang高效实践之interface、reflection、json实践

前言 反射是程序校验自己数据结构和类型的一种机制。文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射。 Interface 在将反射之前需要先介绍下接口interface,因为Golang的反射实现是基于interface的。Golang是静态类型语言,每个变量拥有一个静态类型,在编译器就已经确定,例如int,float32,*My...

weixin_30907523的博客 200

go reflection

refletion

yongbaoii的博客 488

Reflection in golang

package main import ( "reflect" "fmt" "190112/pkg" ) func main() { var reverseInt func([]int) []int BindFunc(&amp;reverseInt,Reverse) fmt.Println(reverseInt([]int{10,20,30})) var reverseSt...

baidu_25845567的博客 273

理解golang反射(reflection in Go)

反射(reflection)是指在运行时,动态获取程序结构信息(元信息)的一种能力,是静态类型语言都支持的一种特性,如Java, golang等。这里主要详细介绍golang reflection相关知识类型与接口(Types and interfaces)typeMyIntint variint varjMyInti 为int类型,j为MyInt类型。虽然i,...

weixin_34268579的博客 275

Go 语言学习

Golang 快速入门

qq_33956536的博客 301

golang reflection

Golang的reflection基础概念整理:package mainimport ( "fmt" "reflect" )func main() { type MyInt int var x MyInt = 7 v := reflect.ValueOf(x) fmt.Println("v.Kind(): ",v.Kind()) fmt.Pri

万里晴空 700

struct用法_Go语言中 Unsafe 的用法

- 后端早读课翻译计划 第三篇-本文列举在 Golang 中 unsafe 的一般用法,以及提供给开发者的一些建议用法。Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.ℹ️ 本文基于 Go 1.12 版本。这个 Package...

weixin_39729784的博客 159

Golang 反射(Reflection)教程

Golang反射是元编程主题,本文将尽量使其简化,让你轻松掌握并在合适场景中灵活应用。 从需求谈起 反射是一种编程能力,可以在运行时检查变量的类型和值。也许你还不理解这意思,读完本文你将会有清晰理解反射的概念。 那什么情况下需要在运行时获取变量的类型和值呢?假如有这样一个需求,写一个函数带有struct类型作为参数,函数功能是根据参数创建INSERT SQL语句保存数据。 type User struct { UserId int UserName string } 下面我们写插.

neweastsun的专栏 1508

Reflection in Go

Source: (1)The Laws of Reflection Digest: Reflection in computing is the ability of a program to examine its own structure, particularly through types; it's a form of metaprogramming. 1. Types and interfaces: Go is statically typed. Every variable has a st

weixin_41709624的博客 302
上一篇: Go语言学习笔记 --- interface
下一篇: Go语言学习笔记 --- concurrency、channel、select
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值