反射

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

​ Import (“reflect”)

reflect.TypeOf,获取变量的类型,返回reflect.Type类型

reflect.ValueOf,获取变量的值,返回reflect.Value类型

reflect.Value.Kind,获取变量的类别,返回一个常量

reflect.Value.Interface(),转换成interface{}类型

获取变量的值:

reflect.ValueOf(x).Float()

reflect.ValueOf(x).Int()

reflect.ValueOf(x).String()

reflect.ValueOf(x).Bool()

通过反射的来改变变量的值

reflect.Value.SetXX相关方法,比如:

reflect.Value.SetFloat(),设置浮点数

reflect.Value.SetInt(),设置整数

reflect.Value.SetString(),设置字符串

package main

import (
"fmt"
"reflect"
) type Student struct {
Name string
Age int
Score float32
} func test(b interface{}) {
//t是b的一个拷贝,修改t,b不会修改!
t := reflect.TypeOf(b) //获取变量的类型,返回reflect.Type类型
fmt.Println(t)
v := reflect.ValueOf(b) //获取变量的值,返回reflect.Value类型
fmt.Println(v)
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)
fmt.Println(val.Elem())
val.Elem().SetInt()
//val.Elem()用来获取指针指向的变量,相当于:
//var a *int;
//*a = 100
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)
}

用反射操作结构体

reflect.Value.NumField()获取结构体中字段的个数

reflect.Value.Method(n).Call来调用结构体中的方法

package main

import (
"fmt"
"reflect"
) type NotknownType struct {
s1 string
s2 string
s3 string
}
func (n NotknownType) String() string {
return n.s1 + "-" + n.s2 + "-" + n.s3
} var secret interface{} = NotknownType{"greg", "learn", "go"} func main() {
value := reflect.ValueOf(secret) // <main.NotknownType Value>
typ := reflect.TypeOf(secret) // main.NotknownType
fmt.Println(value,typ) knd := value.Kind() // struct
fmt.Println(knd) for i := ; i < value.NumField(); i++ {
//value.Field(i).SetString("ningxin")
fmt.Printf("Field %d: %v\n", i, value.Field(i))
} results := value.Method().Call(nil)
fmt.Printf("%T\n",results)
fmt.Println(results)
}

反射回调函数和方法

package main

import (
"fmt"
"reflect"
) type Student struct {
Name string
Age int
Score float64
Sex string
} func (s Student) Print() {
fmt.Println("---start----")
fmt.Println(s)
fmt.Println("---end----")
} func (s Student) Set(name string, age int, score float64, sex string) {
s.Name = name
s.Age = age
s.Score = score
s.Sex = sex
fmt.Println(s)
} func TestStruct(a interface{}) {
val := reflect.ValueOf(a)
kd := val.Kind()
if kd != reflect.Ptr && val.Elem().Kind() == reflect.Struct {
fmt.Println("expect struct")
return
} num := val.Elem().NumField()
val.Elem().Field().SetString("greg") for i := ; i < num; i++ {
fmt.Printf("%d %v\n", i, val.Elem().Field(i).Kind())
} fmt.Printf("struct has %d fields\n", num)
numOfMethod := val.Elem().NumMethod()
fmt.Printf("struct has %d methods\n", numOfMethod) val.Elem().Method().Call(nil) params := make([]reflect.Value,)
params[]=reflect.ValueOf("hhhhhhhhh")
params[]=reflect.ValueOf()
params[]=reflect.ValueOf(59.99999)
params[]=reflect.ValueOf("male")
//fmt.Println(params)
val.Elem().Method().Call(params)
} func main() {
var a Student = Student{
Name: "ningxin",
Age: ,
Score: 92.8,
}
fmt.Println(a)
TestStruct(&a)
}

json序列化是通过反射实现的

package main

import (
"encoding/json"
"fmt"
"reflect"
) type Student struct {
Name string `json:"student_name"`
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 Tagtest(a interface{}) {
tye := reflect.TypeOf(a)
fmt.Println("///////////",tye)
fmt.Println(tye.Elem())
fmt.Println(tye.Elem().Field())
fmt.Println(tye.Elem().Field().Tag)
tag := tye.Elem().Field().Tag.Get("json")
fmt.Printf("tag=%s///////////\n", tag)
} func main() {
var a Student = Student{
Name: "stu01",
Age: ,
Score: 92.8,
} result, _ := json.Marshal(a)
fmt.Println("json result:", string(result))
Tagtest(&a)
fmt.Println(a)
}

GO开发[六]:golang反射(reflect)的更多相关文章

  1. golang反射reflect机制用法

    package main import ( "fmt" "reflect" ) type User struct { Id int Name string Ag ...

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

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

  3. golang中的反射reflect详解

    先重复一遍反射三定律: 1.反射可以将"接口类型变量"转换为"反射类型对象". 2.反射可以将"反射类型对象"转换为"接口类型变量 ...

  4. golang反射初试

    golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf( ...

  5. golang 反射应用(二)

    golang反射应用(二) package test import ( "reflect" "testing" ) //定义适配器 func TestRefle ...

  6. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  7. go语言之行--接口(interface)、反射(reflect)详解

    一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...

  8. [Go] 反射 - reflect.ValueOf()

    类型 和 接口 由于反射是基于类型系统(type system)的,所以先简单了解一下类型系统. 首先 Golang 是一种静态类型的语言,在编译时每一个变量都有一个类型对应,例如:int, floa ...

  9. Golang反射机制

    Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...

  10. 记账本微信小程序开发六

    记账本微信小程序开发六 我的界面 主界面

随机推荐

  1. windows下apache配置虚拟主机

    因为有多个laravel项目需要配置根目录到public下面,所以要配置多个虚拟主机 方法一:添加端口号 第一步:进入apache的目录 Apache24\conf 找到 httpd.conf 文件, ...

  2. VS工程中添加c/c++工程中外部头文件及库的基本步骤

    转载自 在VS工程中,添加c/c++工程中外部头文件及库的基本步骤: 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. 2.添加 ...

  3. OOAD-设计模式(一)概述

    前言 在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式.知道设计模式的作用,以及在代码的具体体现.很多时候我们看不懂代码就是因为我们不知道它使用的设计模式. ...

  4. 江西理工大学南昌校区cool code竞赛

    这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一个人AC了,当时我 ...

  5. 基于C#的数据库文件管理助手

    我们经常会遇到这样的问题,在数据库中的文件存放的是web格式或者是绝对路径,以及使用的是百度上传或者其他上传组件,造成了很多异步上传的冗余文件,如果客户需要我们导出企业官网中的产品图片,我们该如何处理 ...

  6. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  7. javascript中函数的执行环境、作用域链、变量对象与活动对象

    javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...

  8. java if与for循环的题

    //打印一个4*5的空心长方形        /*        for (int i = 0; i < 5;i++ ) {            if (i == 0 | i == 4) {  ...

  9. 织梦DedeCMS v5.7 实现导航条下拉菜单

    首先将下面这段代码贴到templets\default\footer.htm文件里(只要在此文件里就行,位置无所谓) <</span>script type='text/javasc ...

  10. django 编程小结

    1.增删改查 add obj = Obj(atr=atr..) obj.save() update: __dict__ 遍历 del: 根据id列表删除 query: 首次查询: 直接跳转至页面,前端 ...