云海的博客
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)

云海

服务端研发
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)
  • 接口
  • 数组
  • slice
  • map
  • 反射
  • sync.Pool
  • net包笔记
  • net-rpc分析
  • 指针
  • 数组排序
  • Context
  • sync.map
  • 锁
  • recover
  • 泛型
  • 类型和类型指针分析
  • make和new区别
  • channel
  • sync.Once
  • protobuf
  • GoLand debug(1)
  • 从零实现RPC框架
  • 从零开始学Go Origin框架
  • MongoDB pkg源码-findone
  • Golang
云海
2018-06-30

反射

# 方法和类型的反射

反射是用程序检查其所拥有的结构,尤其是类型的一种能力。反射可以在运行时检查类型和变量,例如它的大小、方法和动态的调用这些方法。这对于没有源代码的包尤其有用。这是一个强大的工具,除非真得有必要,否则应当避免使用或小心使用。

变量的最基本信息就是类型和值:反射包的Type用来表示一个Go类型,反射包的Value为Go提供了反射接口。

两个简单的函数,reflect.TypeOf 和 reflect.ValueOf, 返回被检查对象的类型和值。例如,x 被定义为: var x float = 3.4, 那么reflect.Typeof(x) 返回float64, reflect.ValueOf(x) 返回《float64 Value》

实际上,反射是通过检查一个接口的值,变量首先被转换为空接口。 反射可以从接口值反射到对象,也可以从对象反射回接口值。

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())
  y := v.Interface().(float64)
  fmt.Println(y)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 通过反射修改(设置)值

当 v := reflect.ValueOf(x)函数通过传递一个x拷贝创建了v, 那么v的改变并不能更改原始的x。要想v得更改能作用到x,那就必须传递x的地址 v = reflect.ValueOf(&x)。 通过Type() 我们看到v现在的类型是*float, 并且仍然是不可设置的。

上次更新: 2023/01/11
map
sync.Pool

← map sync.Pool→

最近更新
01
函数
04-11
02
面试题
04-11
03
EFK日志收集系统单机版
08-18
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式