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

夫妻网站开发网站开发 设计文档

夫妻网站开发,网站开发 设计文档,接私活 做网站,不需要丢链接可以百度收录的网站空切片与nil切片有区别吗#xff1f; 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil#xff0c;而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片…空切片与nil切片有区别吗 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片和nil切片的初始化方法对于每种情况都会打印它们的输出。你知道下面程序的输出结果是什么吗? func main() {var s []stringlog(1, s)s []string(nil)log(2, s)s []string{}log(3, s)s make([]string, 0)log(4, s) }func log(i int, s []string) {fmt.Printf(%d: empty%t\tnil%t\n, i, len(s) 0, s nil) }上面程序的运行结果如下 1: emptytrue niltrue 2: emptytrue niltrue 3: emptytrue nilfalse 4: emptytrue nilfalse通过输出可以看到上面四种切片empty都为true即它们都是空切片它们的length都为0. 因此nil切片都是空切片。但是只有前两种情况是nil切片。在具体环境中使用哪种方法更好呢有两点需要注意 两者在内存分配方面有很大的不同初始化一个nil切片不会实际分配内存相反初始化一个空切片会分配内存无论是nil切片还是空切片都可以调用内置的append函数例如。 var s1 []string fmt.Println(append(s1, foo)) // [foo]因此如果一个函数返回一个切片我们不应该像在其它编程语言中那样出于防御原因返回一个空切片。因为nil切片不需要任何分配所以我们应该倾向于返回nil切片而不是空切片。下面这个函数返回一个字符串 func f() []string {var s []stringif foo() {s append(s, foo)}if bar() {s append(s, bar)}return s }如果foo和bar都为false,不会向s中添加任何内容。为了防止多余的分配内存操作最佳的方法采用上面的方法1var s []string). 虽然也可以采用第4种方法 make([]string,0)), 但是与方法1相比不会带来任何收益因为它会分配内存。但是在我们已知要申请切片的长度情况下应该使用方法4. s:make([]string,length), 像下面的程序一开始就初始化切片长度这样可以避免额外的内存分配和复制。 func intsToStrings(ints []int) []string {s : make([]string, len(ints))for i, v : range ints {s[i] strconv.Itoa(v)}return s }剩余未讨论的方法2 s:[]string(nil)和方法3 s:[]string{}中方法2使用的最不广泛只是可以用作语法糖因为我们可以在一行代码中完成定义一个nil切片并完成元素添加操作示例程序如下。如果采用方法1var s []string), 则需要两行代码, 虽然这种优化对可读性没有实质性帮助但仍值得了解。 s : append([]int(nil), 42)NOTE:在本系列的第24篇文章中可以看到使用nil切片的另一个理由。 现在来看方法3s:[]string{}, 它比较适用在创建具有初始元素切片的场景。 s : []string{foo, bar, baz}如果我们创建的切片没有初始化元素则没有必要使用上述方法。一些golang linter会捕获到方法3在没有初始化元素的时候推荐使用方法1我们应该知道这种修改实质是将空切片调整为nil切片。 我们也要留意有些库对空切片和nil切片在处理时有区别。例如json库 encoding/json. 下面的例子中都是对struct进行序列化结构体1中赋值的是nil切片结构体2中赋值的是空切片。 var s1 []float32customer1 : customer{ID: foo,Operations: s1, } b, _ : json.Marshal(customer1) fmt.Println(string(b))s2 : make([]float32, 0)customer2 : customer{ID: bar,Operations: s2, } b, _ json.Marshal(customer2) fmt.Println(string(b))运行上述程序得到如下结果可以看到它们的结果是不同的。nil切片序列化后的值为null, 空切片序列化后的值为[]. 如果解析JSON的客户端对null和[]有严格的区分需要特别留意这一点否则会产生bug. {ID:foo,Operations:null} {ID:bar,Operations:[]}encoding/json 并不是唯一一个区分 nil 切片和空切片的标准库标准库 reflect 中 DeepEqual函数在比较nil切片和空切片时会返回false, 这一点在单元测试的时候要特别小心。 不管什么场合无论是标准库还是第三方库我们都要留意nil切片和空切片存在区别如果使用不当可能会引发问题。 总结在Go语言中nil切片和空切片是有区别的。nil切片与nil相等空切片的长度为0但是它不等于nil。重要的一点是 nil切片不会分配内存空切片会分配内存。具体使用哪种方法更好需要具体问题具体分析。如果能够确定最后返回的切片为空则推荐使用 var s []string, 如果在初始化时已知道切片的长度则采用make([]string,length)最好[]string(nil)提供了一种语法糖方便添加元素操作。最后一点如果在进行初始化时没有元素则避免使用 []string{}, 还要留意标准库和第三方库对nil切片和空切片处理可能存在不同如果使用不当会产生意料之外的结果。
http://www.hkea.cn/news/14434807/

相关文章:

  • 如何选网站建设公司网站建设新的技术方案
  • 网站设计师图片asp网站服务器架设
  • 网站设计规划信息技术教案搜索引擎优化诊断
  • 郑州企业网站建站扬中信息网
  • 吉首自治州住房和城乡建设局网站源美网站建设
  • 超级大气的一款工作室网站制作网络科技公司站点源码直接可用重庆建设造价信息网站
  • 嘉兴优化网站排名保险代理公司注册条件
  • 郑州知名做网站公司想给公司做个网站怎么做
  • html网站注册页面网络优化工程师能干一辈子吗
  • 百度网站app龙华网站 建设信科网络
  • 网站seo综合公司做问卷调查的是哪个网站好
  • 建设部网站规范下载项目管理的主要内容包括哪些
  • 搜索引擎及门户网站介绍总结wordpress怎么建淘宝客
  • 一个网站源代码概多大新手学网站建设看什么书好
  • 百度一下就知道了官网楯seo关键词优化渠道
  • 找别人做的网站问什么域名解析后还是上线不八冶建设集团有限公司网站
  • 不得不知道网站营销运营平台
  • 做购物网站的公司西安专业做网站的
  • 武义县建设局网站首页写软文
  • 网站服务器停止响应是什么意思军用棉被门网站建设
  • 网站招聘方案怎么做dedecms建设慕课网站
  • 金华网站建设方案咨询室内设计平面图尺寸
  • 上海做网站品牌公司官网图片
  • 杭州微网站建设怎样做网站才不能被攻破
  • app软件开发网站企业网站登录
  • 湖南建设银行网站填报wordpress模板
  • 怎样提高网站的权重加强网站建设 提升
  • 网站开发的客户群体做模特的网站
  • 企业网站策划方案深圳网站建设公司613
  • 手机网站开发报价单怎样制作wordpress手机主题