golang 反射_golang基础反射reflect

一、反射是什么?反射的主要应用场景

1.Golang提供了一种机制,在编译时不知道类型的情况下,可更新变量、运行时查看值调用方法以及直接对他们的布局进行操作的机制,称为反射

2.反射应用场景

a)有时你需要编写一个函数,但是并不知道传给你的参数类型是什么,可能是没约定好;也可能是传入的类型很多,这些类型并不能统一表示。这时反射就会用的上了。

b)有时候需要根据某些条件决定调用哪个函数,比如根据用户的输入来决定。这时就需要对函数和函数的参数进行反射,在运行期间动态地执行函数。

3.反射主要与Golang的interface类型相关,只有interface类型才有反射一说

二、反射reflect包主要方法

1.reflect.Type和reflect.Value

reflect提供了两种类型来进行访问接口变量的内容:

1)reflect.ValueOf()获取输入参数接口中的数据的值,如果为空则返回0

2)reflect.TypeOf()动态获取输入参数接口中的值的类型,如果为空则返回nil

3)reflect.Type和reflect.Value的关系

d8fb0612a0fae28012fdb83aa43064b4.png

图片引用快学Go语言第十五课

在go语言中,每个值都包含两个内容:类型和实际的值。从类型角度来看,reflect.Value是一个关于的二元组,而reflect.Type是值的类型,二者是包含关系。从方法角度来看,reflect.TypeOf 和 (reflect.ValueOf(x)).Type都可以返回reflect.Type;(reflect.ValueOf(x)).Float可以返回实际的值(类似的方法还包括(reflect.ValueOf(x)).Int、(reflect.ValueOf(x)).Bool等);(reflect.ValueOf(x)).Kind可以返回一个常量定义的类型。

2.reflect.Type和Value的常用方法

1)Type和Value拥有的同名方法

eb1c1d1827dd3b0419c29c241c6c85d9.png

2)Type中独有的方法

38771f0ca0775c43a083f9b1c8aef3db.png

3)Value中独有的方法

349c506134b10cd8796e1bc744114e4c.png
136364c0577f937ac415befa63408a05.png

三、反射示例

1.通过反射修改内容

package main

import (

"reflect"

"fmt"

)

type Language struct {

Name string

}

func main() {

s := &Language{Name: “go”}

v := reflect.ValueOf(s)

// 修改值必须是指针类型

if v.Kind() != reflect.Ptr {

fmt.Println(“not pointer type”)

return

}

// 获取指针所指向的元素

v = v.Elem()

// 获取目标key的Value的封装

name := v.FieldByName("Name")

if name.Kind() == reflect.String {

name.SetString(“python”)

}

fmt.Printf("%#v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值