设为首页 加入收藏

TOP

Go语言备忘录:反射的原理与使用详解(二)
2017-10-13 10:50:35 】 浏览:7905
Tags:语言 备忘录 反射 原理 使用 详解
v.SetFloat(7.1) fmt.Println(v.Interface()) //7.1 fmt.Println(x) //7.1

虽然反射可以越过Go语言的导出规则的限制读取结构体中未导出的成员,但不能修改这些未导出的成员。因为一个struct中只有被导出的字段才是settable的。

type T struct {
    A int
    B string
}
t := T{23, "skidoo"}
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()//把s.Type()返回的Type对象复制给typeofT,typeofT也是一个反射。
for i := 0; i < s.NumField(); i++ {
    f := s.Field(i)//迭代s的各个域,注意每个域仍然是反射。
    fmt.Printf("%d: %s %s = %v\n", i,
        typeOfT.Field(i).Name, f.Type(), f.Interface())//提取了每个域的名字
}
//0: A int = 23
//1: B string = skidoo

s.Field(0).SetInt(77) //s.Field(0).Set(reflect.ValueOf(77))
s.Field(1).SetString("Sunset Strip")
fmt.Println("t is now", t)  //t is now {77 Sunset Strip}
 
6.反射库提供了内置函数make和new的对应操作,如reflect.MakeFunc()方法,通过它可以实现类似“泛型”的功能:
  • 定义一个可适应不同数据类型的通用模板算法函数,然后用reflect.MakeFunc()方法,可以把任意函数类型变量绑定到通用模板算法函数(为一系列函数对象指定同一个函数体);
package main

import (
	"reflect"
	"strings"
	"fmt"
)
//通用算法函数体模板
func add(args []reflect.Value) (results []reflect.Value) {
	if len(args) == 0 {
		return nil
	}
	var r reflect.Value
	switch args[0].Kind() {
	case reflect.Int:
		n:=0
		for _,a:=range args{
			n+=int(a.Int())
		}
		r = reflect.ValueOf(n)
	case reflect.String:
		ss := make([]string,0,len(args))
		for _,s:=range args{
			ss = append(ss,s.String())
		}
		r=reflect.ValueOf(strings.Join(ss,""))
	}
	results = append(results,r)
	return
}
func makeAdd(T interface{})  {
	fn:=reflect.ValueOf(T).Elem()
	v:=reflect.MakeFunc(fn.Type(),add) //把原始函数变量的类型和通用算法函数存到同一个Value中
	fn.Set(v)  //把原始函数指针变量指向v,这样它就获得了函数体
}
func main() {
    //定义函数变量,未定义函数体
	var intAdd func(x,y int) int
	var strAdd func(a,b string) string

	makeAdd(&intAdd)
	makeAdd(&strAdd)

	fmt.Println(intAdd(12,23))  //35
	fmt.Println(strAdd("hello, ","world!")) //hello, world!
}
 
 最后,反射对性能有一定的影响,如对性能要求较高,须谨慎使用反射!
 
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Golang:使用自定义模板发送邮件 下一篇golang 标准库间依赖的可视化展示

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目