1、反射:可以在运行时动态获取变量的相关信息

Import(“reflect”)

两个函数:

reflect.TypeOf()//获取变量的类型,返回reflect.Type类型
reflect.ValueOf()//获取变量的值,返回reflect.Value类型
reflect.Value.Kind()//获取变量的类别,返回一个常量
reflect.Value.Interface()//转换成interface{}类型

可逆状态

示例用法

package main

import (
"fmt"
"reflect"
) type Student struct {
Name string
Age int
Score float32
} func test(b interface{}) {
t := reflect.TypeOf(b)
fmt.Println(t) v := reflect.ValueOf(b)
k := v.Kind()
fmt.Println(k) iv := v.Interface()
stu, ok := iv.(Student)
if ok {
fmt.Printf("%v %T\n", stu, stu)
}
}
func testInt(b interface{}) {
val := reflect.ValueOf(b)
c := val.Int()
fmt.Printf("get value interface{} %d\n", c)
} func main() {
var a Student = Student{
Name: "stu01",
Age: ,
Score: ,
}
test(a)
testInt()
}

反射用法

package main

import (
"fmt"
"reflect"
)
func main(){
var x float64=3.4
fmt.Println("type:",reflect.TypeOf(x)) v:=reflect.ValueOf(x)
fmt.Println("value:",v)
fmt.Println("type:",v.Type())
fmt.Println("kind:",v.Kind())
fmt.Println("value:",v.Float()) fmt.Println(v.Interface())
fmt.Printf("value is %5.2e\n",v.Interface())
y:=v.Interface().(float64)
fmt.Println(y)
}

反射练习

获取变量的值

reflect.ValueOf(x).Float()
reflect.ValueOf(x).Int()
reflect.ValueOf(x).String()
reflect.ValueOf(x).Bool()

反射之elem()修改指针的方法

package main

//通过反射动态修改变量的值
import (
"fmt"
"reflect"
) type Student struct {
Name string
Age int
Score float32
} func test(b interface{}) {
t := reflect.TypeOf(b)
fmt.Println(t) v := reflect.ValueOf(b)
k := v.Kind()
fmt.Println(k) iv := v.Interface()
stu, ok := iv.(Student)
if ok {
fmt.Printf("%v %T\n", stu, stu)
}
} func testInt(b interface{}) {
val := reflect.ValueOf(b)
val.Elem().SetInt() //val.Elem().Setint()相当于指针操作 c := val.Elem().Int()
fmt.Printf("get value interface{}%d\n", c)
fmt.Printf("string val:%d\n", val.Elem().Int())
}
func main() {
var a Student = Student{
Name: "stu01",
Age: ,
Score: ,
}
test(a)
var b int =
b =
testInt(&b)
fmt.Println(b)
}

val.Elem().SetInt()

用反射操作结构体

reflect.Value.NumField()获取结构体中字段的个数
reflect.Value.Method(n).Call来条用结构体中的方法

反射取得结构体方法个数,字段数

package main

//通过反射动态修改变量的值
import (
"fmt"
"reflect"
) type Student struct {
Name string
Age int
Score float32
Sex string
} func (s Student) Set(name string, age int, score float32, sex string) {
s.Name = name
s.Age = age
s.Score = score
s.Sex = sex
} func TestStruct(a interface{}) {
val := reflect.ValueOf(a)
kd := val.Kind()
if kd != reflect.Struct {
fmt.Println("expect struct")
return
}
num := val.NumField()
fmt.Printf("struct has %d fields\n", num) numOfMethod := val.NumMethod()
fmt.Printf("struct has %d methods\n", numOfMethod)
} func main() {
var a Student
a = Student{
Name: "stu01",
Age: ,
Score: 92.8,
}
TestStruct(a)
fmt.Println(a)
}

代码在这

反射练习

package main

//通过反射动态修改变量的值
import (
"fmt"
"reflect"
) type NotKnownType struct {
s1 string
s2 string
s3 string
} //定义一个String方法
func (n NotKnownType) String() string {
return n.s1 + "-" + n.s2 + "-" + n.s3
} var secret interface{} = NotKnownType{"Ada", "Go", "Oberon"} func main() {
value := reflect.ValueOf(secret) //<main.NotKnownType Value>
typ := reflect.TypeOf(secret) //main.NotKnownType
fmt.Println(typ)
knd := value.Kind() //struct
fmt.Println(knd)
for i := ; i < value.NumField(); i++ {
fmt.Printf("Field %d:%v\n", i, value.Field(i))
}
results := value.Method().Call(nil)
fmt.Println(results)//[Ada-Go-Oberon]
}

反射练习

通过反射修改结构体

package main

import (
"fmt"
"reflect"
) type T struct {
A int
B string
} func main() {
t := T{, "skidoo"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()
for i := ; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d:%s %s=%v\n",
i, typeOfT.Field(i).Name, f.Type(), f.Interface())
}
s.Field().SetInt()
s.Field().SetString("Sunset Strip")
fmt.Println("t is now", t)
}

反射修改结构体

Golang之反射(重点!!)的更多相关文章

  1. Golang的反射reflect深入理解和示例

    编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...

  2. Golang通过反射获取结构体的标签

    Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...

  3. Golang通过反射拼接一个结构体所有字段

    golang通过反射拼接一个结构体所有字段 需求 将一个结构体所有字段以"|"连接拼接成字符串 golang 不同类型拼接成string使用Sprintf比较麻烦,如果一个结构体有 ...

  4. golang(11) 反射用法详解

    原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...

  5. GoLang之反射

    反射 反射(reflect) 所谓反射(reflect)就是能检查程序在运行时的状态. 使用反射的三条定律: 反射可以将“接口类型变量”转换为“反射类型对象”: 反射可以将“反射类型对象”转换为“接口 ...

  6. Golang reflect 反射

    反射的规则如下: 从接口值到反射对象的反射  从反射对象到接口值的反射  为了修改反射对象,其值必须可设置   -------------------------------------------- ...

  7. golang--深入简出,带你用golang的反射撸一个公用后台查询方法

    一些基本方法 本篇不会介绍反射的基本概念和原理等,会从每个常用的方法入手,讲解一些基本和进阶用法,反射不太适合在业务层使用,因为会几何倍的降低运行速度,而且用反射做出来的程序健壮度不高,一旦一个环节没 ...

  8. 『GoLang』反射

    方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...

  9. golang通过反射动态调用方法

    func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f ...

随机推荐

  1. Opencv中Rect类

    转载: Rect_类有些意思,成员变量x.y.width.height,分别为左上角点的坐标和矩形的宽和高.常用的成员函数有Size()返回值为一个Size,area()返回矩形的面积,contain ...

  2. np.ones(N)/N的作用

    在python中导入numpy包 N=5 weights = np.ones(N)/N       //这里就相当于创建了一个数组,且为5个1/5的数组 print "weights&quo ...

  3. C# 实现网络时间同步功能

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  4. ASP.NET MVC3默认提供了11种ActionResult的实现

      在System.Web.Mvc命名空间 ActionResult ContentResult EmptyResult FileResult HttpStatusCodeResult HttpNot ...

  5. ringojs java jar 集成使用

    ringojs 可以方便进行java 代码的集成,我们可以把下载的jar包放到classpath,后者ringojs 的lib 目录 也可以进行代码编写 测试代码 集成了java 的一个hashid ...

  6. 02 - Unit05:加载笔记列表

    加载笔记列表 发送Ajax请求 绑定发送事件 获取参数: bookId 发送请求: /note/list.do 事件绑定 $(function(){ Ajax请求发送-->服务器处理--> ...

  7. Renesas PPP Mode

    不同厂家的NB/4G/2G,配置PPP模式略有差异,回调配置在如下路径: “synergy\ssp_supplemental\src\framework\sf_cellular_cat3\sf_cel ...

  8. postman-2get发送请求

    文档地址:https://www.v2ex.com/p/7v9TEc53 第一个API请求 最热主题 相当于首页右侧的 10 大每天的内容. https://www.v2ex.com/api/topi ...

  9. jQuery ajax 当async为false时解决同步操作失败的问题

    jQuery的ajax,当async为false时,同步操作失败.解决方案,jqueryasync 最近做项目遇到jQuery的ajax,当async为false时,同步操作失败的问题,上网搜索下,得 ...

  10. Ubuntu下VIM使用指南

    基本命令: Esc:VIM中的万能功能键之一,基本上任何时候按这个键,都可以返回VIM的普通状态. i:在普通状态下按i可以进入“插入”编辑状态,这个时候按方向键移动光标,在想要输入的地方输入字符,用 ...