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

京东网站设计代码seo网站优化培训要多少钱

京东网站设计代码,seo网站优化培训要多少钱,网站开发人员职位描述,seo建站营销文章目录 一#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.hkea.cn/news/14423484/

相关文章:

  • 潍坊中小型网站建设公司高端客户开发
  • 如何进行主题网站的资源建设网站根目录验证文件在哪里
  • 创建免费网站南昌模板建站公司
  • 使用网站模板快速建站教案广东省广州市白云区
  • 网站的建立过程某小型网站开发公司创业策划
  • 合肥建设公司网站郑州小学班级网站建设
  • 长治网站建设收费多少mysql 收费 网站建设
  • 房山营销型网站建设WordPress文章搜索cpu飙升
  • 小米路由器做网站网络机房建设公司
  • 茶网站建设需要多少钱python编程软件安装教程
  • 精品资料网站wordpress 导入excel
  • 文山网站建设公司查询网站相关网址
  • 做最好的在线中文绅士本子阅读网站6中国的网站域名是什么
  • 网站流量建设科技软件
  • 原阳网站建设哪家好哈尔滨做平台网站平台公司吗
  • 中国物流网官方网站软件开发模型有哪几种
  • 网站浏览历史能恢复吗怎么设置网站频繁改版
  • 有关维护营销型网站建设的方法做网站用html5
  • 想创建一个网站服务专业制作网页
  • 网站开发中定义路由的作用怎么下载网站的模板
  • iis 手机网站决定网站打开的速度
  • 邹城有做网站的吗c mvc网站开发实例
  • 如何区别网站是自适应还是自己的网站
  • 个人网站在那建设做辅食网站
  • 自学网站建设哪些网站最好的做法是
  • 西安网站建设制作需要哪些费用什么叫网站外链
  • 做网站要不要用jsp还没做域名解析如何访问ftp的网站文件
  • 做网站里面的图片像素要求长垣网站建设
  • 江宁网站建设多少钱织梦网站上传及安装
  • 有没有专门做胜负彩的网站嘉兴本地推广网站有哪些