当前位置: 首页 > news >正文

长丰县住房和城乡建设局网站丹东企业做网站

长丰县住房和城乡建设局网站,丹东企业做网站,无锡网站开发,动漫网站怎么做的概念#xff1a; 官方对此有个非常简明的介绍#xff0c;两句话耐人寻味#xff1a; 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条#xff0c;再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条#xff0c;很有喜感的自嘲…概念 官方对此有个非常简明的介绍两句话耐人寻味 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条很有喜感的自嘲不过往后看就笑不出来了因为你很可能产生困惑。 reflect 实现了运行时的反射能力能够让程序操作不同类型的对象。反射包中有两对非常重要的函数和类型两个函数分别是 reflect.TypeOf()   能获取类型信息reflect.ValueOf() 能获取数据的运行时表示 只有这么简单吗当然不是请继续阅读。 引出 其实了解反射的第一步应从interface入手因为反射与接口存在着千丝万缕的关系。 如下是一段interface的源码 type iface struct {tab *itabdata unsafe.Pointer }// layout of Itab known to compilers // allocated in non-garbage-collected memory // Needs to be in sync with // ../cmd/compile/internal/gc/reflect.go:/^func.dumptypestructs. type itab struct {inter *interfacetype_type *_typelink *itabbad int32inhash int32 // has this itab been added to hash?fun [1]uintptr // variable sized } 看不懂也没关系我对其大致简化一番从reflect角度再来看看并思考从iface中看到的字段 type I interface{// 方法集 } type iface struct{typ reflect.Type // 储存类型信息val reflect.Value // 储存实际值 } 之所以引出interface是因为想说interface类型有个(valuetype)对而反射就是检查interface的这个(value, type)对的。具体一点说就是Go提供一组方法提取interface的value提供另一组方法提取interface的type。 reflect.Type 提供一组接口处理interface的类型即value, type中的typereflect.Value 提供一组接口处理interface的值,即(value, type)中的value 下面会提到反射对象所谓反射对象即反射包里提供的两种类型的对象。 reflect.Type 类型对象reflect.Value 类型对象 三大法则 第一法则 从 interface{} 变量可以反射出反射对象 下面示例看看是如何通过反射获取一个变量的值和类型的 package mainimport (fmtreflect )func main() {var x float64 3.4t : reflect.TypeOf(x) //t is reflext.Typefmt.Println(type:, t)v : reflect.ValueOf(x) //v is reflext.Valuefmt.Println(value:, v) }运行如下 type: float64 value: 3.4 是不是疑惑了明明是上述是x-reflect类型却依然说是 interface{} --变为-- reflect类型呢这是因为在TypeOf 与 ValueOf 内部自动将 值类型转化为了 接口类型。 第二法则 从反射对象可以获取 interface{} 变量 package mainimport (fmtreflect )func main() {var x float64 3.4v : reflect.ValueOf(x) //v is reflext.Valuevar y float64 v.Interface().(float64)fmt.Println(value:, y) } 1、用reflect.ValueOf(x) 获取value值。 2、v.Interface() 转化成接口。 3、类型断言转化成对应的基本类型 第三法则 要修改反射对象其值必须可设置。 通过反射可以将interface类型变量转换成反射对象可以使用该反射对象设置其持有的值。在介绍何谓反射对象可修改前先看一下失败的例子 package mainimport (reflect )func main() {var x float64 3.4v : reflect.ValueOf(x)v.SetFloat(7.1) // Error: will panic. }如下代码通过反射对象v设置新值会出现panic。报错如下panic: reflect: reflect.Value.SetFloat using unaddressable value 错误原因即是v是不可修改的。 反射对象失败取决于是否可以修改其储存的值。回想一下函数传参时是传值还是传址就不难理解上例中为何失败。 上例中传入 reflect.ValueOf() 函数的其实是x的值而非x本身。即通过v修改其值是无法影响x的也即是无效的修改所以 golang 会报错。 想到此处即可明白如果构建v时使用x的地址就可实现修改了但此时v代表的是指针地址我们要设置的是指针所指向的内容也即我们想要修改的是*v。 那怎么通过v修改x的值呢 reflect.Value 提供了 Elem() 方法可以获得指针向指向的Value 。看如下代码 package mainimport ( reflectfmt )func main() {var x float64 3.4v : reflect.ValueOf(x)v.Elem().SetFloat(7.1)fmt.Println(x :, v.Elem().Interface()) } 1、调用reflect.ValueOf 获取变量指针。 2、调用 reflect.Value.Elem 获取指针指向的变量。 3、调用 reflect.Value.SetFloat() 更新变量。 总结 以上为本篇博客精华内容如有不妥请及时私信联系我斟酌之后必加以纠正。 待后续深入学习时会转回继续修改。 参考内容 1、《Go专家编程》 2、《Go语言设计与实践》
http://www.w-s-a.com/news/640590/

相关文章:

  • 美团做团购网站如何新建自己的网站
  • 安卓软件制作网站电子商务网站建设实训总结报告
  • 肃宁网站制作价格外国设计师素材网站
  • 自已建网站用jsp做的可运行的网站
  • 外贸建站代理网站建设设计公司哪家好
  • 普升高端品牌网站建设台州中兴建设咨询有限公司网站
  • 模板演示网站移动网站开发公司
  • 网站管理办法制度公司招聘信息
  • 宜昌市建设监理协会网站免备案免费域名
  • 河北省建设银行网站首页备案号怎么放到网站
  • 做电脑网站用什么软件有哪些wordpress版权修改
  • 加强部门网站建设工作wordpress文章页横幅
  • 中英网站怎么做wordpress本地音乐
  • 万网提供的网站建设服务的具体项目祥云平台网站建设
  • ftp网站怎么看后台的代码网站 制作软件
  • 网站开发软件教程网站tag 怎么实现
  • 中国建设监理协会化工监理协会网站彩票站自己做网站吗
  • 170个可带链接锚文本外链的网站论坛微信上如何创建小程序
  • 用js来做网站亳州建设局网站
  • 做网站的公司利润多少呢纺织厂网站模板
  • 网页设计构建的基本流程宜宾seo网站建设
  • 西安网站开发公司价格保定徐水网站建设
  • 学做川菜下什么网站软件著作权和专利的区别
  • 百度网站标题东莞外包公司有哪些
  • 织梦增加网站英文名称网页界面设计特点
  • 企业如何进行网站建设棋牌代理平台
  • 韩国做美食网站有哪些seo优化在线诊断
  • 网站建设规划模板做擦边网站
  • 做网站台式还是笔记本网上下载的免费网站模板怎么用
  • 高校网站群管理系统凡科建站是永久的吗