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

英文网站制作费用网页仿制在线

英文网站制作费用,网页仿制在线,设计网站主页要多少钱,建设银行网上银行网站进入不了文章目录 一#xff1a;interface{}简介二、interface{}判空三#xff1a;注意点四#xff1a;实际案例 一#xff1a;interface{}简介 在go中的nil只能赋值给指针、channel、func、interface、map或slice类型的变量 interface 是否根据是否包含有 method#xff0c;底层… 文章目录 一interface{}简介二、interface{}判空三注意点四实际案例 一interface{}简介 在go中的nil只能赋值给指针、channel、func、interface、map或slice类型的变量 interface 是否根据是否包含有 method底层实现上用两种 struct 来表示iface 和 eface。 eface表示不含 method 的 interface 结构或者叫 empty interface。对于 Golang 中的大部分数据类型都可以抽象出来 _type 结构同时针对不同的类型还会有一些其他信息。 iface 表示 non-empty interface 的底层实现。相比于 empty interfacenon-empty 要包含一些 method。method 的具体实现存放在 itab.fun 变量里。 定义在 src/runtime/runtime2.go 中 type iface struct {tab *itabdata unsafe.Pointer }type eface struct {_type *_typedata unsafe.Pointer }上述就是两种 interface 的定义。然后我们再看 iface中的 itab 结构(被定义在 src/runtime/runtime2.go 中) type itab struct {inter *interfacetype // 接口的类型_type *_type // 实际对象类型// ... 还有一些其他字段 }type _type struct {size uintptr // 大小信息.......hash uint32 // 类型信息tflag tflag align uint8 // 对齐信息....... }不管是iface还是eface我们可以明确的是interface包含有一个字段_type *_type表示类型有一个字段data unsafe.Pointer指向了这个interface代表的具体数据。 二、interface{}判空 只有内部类型都为nil总的interface才是空的。 var inter interface{} nil if internil{fmt.Println(empty) }else{fmt.Println(not empty) }结果为 empty nil为untyped类型赋值给interface{}则type和value都是nil比较的结果是true 其他有类型的赋值给interface{}结果是false例如 var inter interface{} (*int)(nil)if internil{fmt.Println(empty)}else{fmt.Println(not empty)}  结果为 not empty 对interface{}判空的方法是使用反射的方式进行判断 var inter interface{} (*int)(nil)if IsNil(inter){fmt.Println(empty)}else{fmt.Println(not empty)}func IsNil(i interface{}) bool {vi : reflect.ValueOf(i)if vi.Kind() reflect.Ptr {return vi.IsNil()}return false }结果为 empty 三注意点 即使接口持有的值为 nil也不意味着接口本身为 nil。在执行以下语句的时候是有可能报panic的 var x intreflect.ValueOf(x).IsNil()而输出也是非常明显的指出错误 panic: reflect: call of reflect.Value.IsNil on int Value因为不可赋值 nil 的 interface 是不能使用 reflect.Value.IsNil 方法的。 那么问题就很好解决了。 解决方式 我们在执行reflect.Value.IsNil方法之前进行一次判断是否为指针即可: func IsNil(x interface{}) bool {if x nil {return true}rv : reflect.ValueOf(x)return rv.Kind() reflect.Ptr rv.IsNil() }重点在于rv.Kind() reflect.Ptr rv.IsNil()这段代码。 这段代码的作用 判断 x 的类型是否为指针。判断 x 的值是否真的为 nil。 下面我们使用几种常见的数据类型来进行测试 func IsNil(x interface{}) bool {if x nil {return true}rv : reflect.ValueOf(x)return rv.Kind() reflect.Ptr rv.IsNil() }func main() {fmt.Printf(int IsNil: %t\n, IsNil(returnInt())) // int IsNil: falsefmt.Printf(intPtr IsNil: %t\n, IsNil(returnIntPtr())) // intPtr IsNil: truefmt.Printf(slice IsNil: %t\n, IsNil(returnSlice())) // slice IsNil: falsefmt.Printf(map IsNil: %t\n, IsNil(returnMap())) // map IsNil: falsefmt.Printf(interface IsNil: %t\n, IsNil(returnInterface())) // interface IsNil: truefmt.Printf(structPtr IsNil: %t\n, IsNil(returnStructPtr())) // structPtr IsNil: true }func returnInt() interface{} {var value intreturn value }func returnIntPtr() interface{} {var value *intreturn value }func returnSlice() interface{} {var value []stringreturn value }func returnMap() interface{} {var value map[string]struct{}return value }func returnInterface() interface{} {var value interface{}return value }type People struct {Name string }func returnStructPtr() interface{} {var value *Peoplereturn value }我们先后使用了 int、*int、slice、map、interface{}、自定义结构体 来测试此IsNil方法。运行程序输出为 int IsNil: false intPtr IsNil: true slice IsNil: false map IsNil: false interface IsNil: true structPtr IsNil: true从测试结果来看目前是符合我们对此方法的定位的。 四实际案例 工作中实际的场景一般是因为面向接口编程可能经过了很长的链路处理在某个节点返回了一个空的结构体如下 某个环节有一个A方法可能会返回一个nil的*People type People struct {Name string }func A() *People {// ... 一些逻辑return nil }在调用方可能是用interface{}接收的然后判断是否为空用的发现不为nil 后续使用该变量就会报空指针异常了 p : A()func B(people interface{}){if people ! nil {fmt.Println(people.Name)} }如上代码便会抛panic因为p赋值给了interface{}尽管p是nil但是people并不是nil因为_type不是空但是使用people.Name会报空指针异常panic因为data是空的。正确的做法应该是如下形式 p : A()func B(people interface{}){if !IsNil(people) {fmt.Println(people.Name)} }func IsNil(x interface{}) bool {if x nil {return true}rv : reflect.ValueOf(x)return rv.Kind() reflect.Ptr rv.IsNil() }
http://www.pierceye.com/news/158528/

相关文章:

  • 网站制作网页做简单的网站首页
  • 怎样做网站上的语种链接泰安网络犯罪案件
  • soap公司网站建设国家游戏网站
  • 网站可以用什么做安阳区号是什么
  • 网站建设实战李静如何建设网站的能力
  • 威海 网站开发做家具的网站有哪些
  • 宁波网站建设公司怎么报价网页打开速度慢的解决方法
  • 有趣的网站有哪些推荐关键词没有排名的网站怎么做
  • 昆山网站制作哪家强海淀区企业网络公司
  • 北京网站制建设公司永兴县网站建设服务商
  • 嘉兴做网站优化公司江阴网站优化公司
  • dz可以做旅游网站吗wordpress 4.1.1 漏洞
  • 谷歌网站地图生成福州便民网免费发布信息
  • 最新军事战争新闻超级优化大师
  • 好的网站建设公司排名网站建设 交易保障
  • 怎么查看网站外链效果代理注册公司有什么风险
  • 西安网站漏洞免费自动生成小程序
  • 怎么修改网站信息同ip网站做301
  • 松江品划网络做网站logo设计网页
  • 重庆博达建设集团股份有限公司网站徐州建设企业网站
  • 有没有专门做老年婚介的网站东营会计信息网官网
  • 鞍山怎么做平台软件汕头网站时优化
  • 邹城建网站深圳装修公司排行榜
  • 泊头网站优化WordPress如何添加cnzz
  • dz论坛网站创建页面wap网站建设方案 pdf
  • 网站建设项目报告总结报告seo关于网站搜索排名关键词的标准评定
  • 东莞电商网站建设wordpress注册验证邮箱
  • 网站建设名中国建设劳动学会是假网站吗
  • 一个优秀的个人网站百度极速版免费下载安装
  • 咋做211校徽加网站wordpress免费教程视频教程