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

永久免费素材网ppt模板山东seo优化

永久免费素材网ppt模板,山东seo优化,新闻网站建设方案,苏州服务器托管商使用携带range子句的for语句时需要注意哪些细节? numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容? 答案:[1 2 3 7 5 6] 当for语句被执行…

使用携带range子句的for语句时需要注意哪些细节?

numbers1 := []int{1, 2, 3, 4, 5, 6}
for i := range numbers1 {if i == 3 {numbers1[i] |= i}
}
fmt.Println(numbers1)

这段代码执行后会打印出什么内容?

答案:[1 2 3 7 5 6]

当for语句被执行的时候,在range关键字右边的numbers1会先被求值。

这个位置上的代码被称为range表达式。range表达式的结果值可以是数组、数组的指针、切片、字符串、字典或者允许接收操作的通道中的某一个,并且结果值只能有一个。

对于不同种类的range表达式结果值,for语句的迭代变量的数量可以有所不同。

就拿我们这里的numbers1来说,它是一个切片,那么迭代变量就可以有两个,右边的迭代变量代表当次迭代对应的某一个元素值,而左边的迭代变量则代表该元素值在切片中的索引值。

稍稍修改一下上面的代码

numbers2 := [...]int{1, 2, 3, 4, 5, 6}
maxIndex2 := len(numbers2) - 1
for i, e := range numbers2 {if i == maxIndex2 {numbers2[0] += e} else {numbers2[i+1] += e}
}
fmt.Println(numbers2)

打印的内容会是什么?

答案:[7 3 5 7 9 11]

需要注意两点:

  1. range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代;
  2. range表达式的求值结果会被复制,也就是说,被迭代的对象是range表达式结果值的
    副本而不是原值。

基于这两个规则,我们接着往下看。在第一次迭代时,我改变的是numbers2的第二个元素的值,新值为3,也就是1和2之和。

但是,被迭代的对象的第二个元素却没有任何改变,毕竟它与numbers2已经是毫不相关的两个数组了。因此,在第二次迭代时,我会把numbers2的第三个元素的值修改为5,即被迭代对象的第二个元素值2和第三个元素值3的和。

以此类推,之后的numbers2的元素值依次会是7911。当迭代到最后一个元素时,我会把numbers2的第一个元素的值修改为16之和。

我们再次修改代码

	numbers3 := []int{1, 2, 3, 4, 5, 6}maxIndex3 := len(numbers2) - 1for i, e := range numbers3 {if i == maxIndex3 {numbers3[0] += e} else {numbers3[i+1] += e}}fmt.Println(numbers3)

把numbers2的值由一个数组改成一个切片,其中的元素值都不变。为了避免混淆,把这个切片值赋给变量numbers3,并且把后边代码中所有的numbers2都改为numbers3。

执行这段代码后打印的内容会是什么呢?

答案:[22 3 6 10 15 21]

切片与数组是不同的,切片是引用类型的,而数组是值类型的,所以上述第二段和第三段代码的结果是不同的,具体原因之前文章有提到–数组和切片底层原理。

switch语句中的switch表达式和case表达式之间有着怎样的联系?

先看一段代码:

value1 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch 1 + 3 {
case value1[0], value1[1]:fmt.Println("0 or 1")
case value1[2], value1[3]:fmt.Println("2 or 3")
case value1[4], value1[5], value1[6]:fmt.Println("4 or 5 or 6")
}

case表达式一般由case关键字和一个表达式列表组成,表达式列表中的多个表达式之间需要有英文逗号,分割,比如,上面代码中的case value1[0], value1[1]就是一个case表达式,其中的两个子表达式都是由索引表达式表示的。

在这里的每个case子句中的那些打印语句,会分别打印出不同的内容,这些内容用于表示case子句被选中的原因,比如,打印内容0 or 1表示当前case子句被选中是因为switch表达式的结果值等于0或1中的某一个。

拥有这样三个case表达式的switch语句可以成功通过编译吗?如果不可以,原因是什么?如果可以,那么该switch语句被执行后会打印出什么内容。

switch语句switch表达式的结果类型,以及各个case表达式中子表达式的结果类型都是有要求的。毕竟,在 Go 语言中,只有类型相同的值之间才有可能被允许进行判等操作。

如果switch表达式的结果值是无类型的常量,比如1 + 3的求值结果就是无类型的常量4,那么这个常量会被自动地转换为此种常量的默认类型的值,比如整数4的默认类型是int,又比如浮点数3.14的默认类型是float64。

因此,由于上述代码中的switch表达式的结果类型是int,而那些case表达式中子表达式的结果类型却是int8,它们的类型并不相同,所以这条switch语句是无法通过编译的。

再来看一段很类似的代码:

value2 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value2[4] {
case 0, 1:fmt.Println("0 or 1")
case 2, 3:fmt.Println("2 or 3")
case 4, 5, 6:fmt.Println("4 or 5 or 6")
}

switch表达式的结果值是int8类型的,而那些case表达式中子表达式的结果值却是无类型的常量了。这与之前的情况恰恰相反。那么,这样的switch语句可以通过编译吗?

答案是肯定的。因为,如果case表达式中子表达式的结果值是无类型的常量,那么它的类型会被自动地转换为switch表达式的结果类型,又由于上述那几个整数都可以被转换为int8类型的值,所以对这些表达式的结果值进行判等操作是没有问题的。

当然了,如果这里说的自动转换没能成功,那么switch语句照样通不过编译。

image.png

由于需要进行判等操作,所以switch表达式case表达式的子表达式的结果类型需要相同。

switch语句会进行有限的类型转换,但肯定不能保证这种转换可以统一它们的类型。还要注意,如果这些表达式的结果类型有某个接口类型,那么一定要小心检查它们的动态值是否都具有可比性(或者说是否允许判等操作)。

switch语句对它的case表达式有哪些约束?

switch语句在case子句的选择上是具有唯一性的。

正因为如此,switch语句不允许case表达式中的子表达式结果值存在相等的情况,不论这些结果值相等的子表达式,是否存在于不同的case表达式中,都会是这样的结果。具体请看这段代码:

value3 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value3[4] {case 0, 1, 2:fmt.Println("0 or 1 or 2")case 2, 3, 4:fmt.Println("2 or 3 or 4")case 4, 5, 6:fmt.Println("4 or 5 or 6")
}

由于在这三个case表达式中存在结果值相等的子表达式,所以这个switch语句无法通过编译。不过,好在这个约束本身还有个约束,那就是只针对结果值为常量的子表达式。

比如,子表达式1+1和2不能同时出现,1+3和4也不能同时出现。有了这个约束的约束,我们就可以想办法绕过这个对子表达式的限制了。再看一段代码:

value5 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value5[4] {case value5[0], value5[1], value5[2]:fmt.Println("0 or 1 or 2")case value5[2], value5[3], value5[4]:fmt.Println("2 or 3 or 4")case value5[4], value5[5], value5[6]:fmt.Println("4 or 5 or 6")
}

变量名换成了value5,但这不是重点。重点是,我把case表达式中的常量都换成了诸如value5[0]这样的索引表达式。

虽然第一个case表达式和第二个case表达式都包含了value5[2],并且第二个case表达式和第三个case表达式都包含了value5[4],但这已经不是问题了。这条switch语句可以成功通过编译。

不过,这种绕过方式对用于类型判断的switch语句(以下简称为类型switch语句)就无效了。因为类型switch语句中的case表达式的子表达式,都必须直接由类型字面量表示,而无法通过间接的方式表示。代码如下:

value6 := interface{}(byte(127))
switch t := value6.(type) {
case uint8, uint16:fmt.Println("uint8 or uint16")case byte:fmt.Printf("byte")
default:fmt.Printf("unsupported type: %T", t)
}

量value6的值是空接口类型的。该值包装了一个byte类型的值127。在后面使用类型switch语句来判断value6的实际类型,并打印相应的内容。

这里有两个普通的case子句,还有一个default case子句。前者的case表达式分别是case uint8, uint16和case byte。你还记得吗?byte类型是uint8类型的别名类型。

因此,它们两个本质上是同一个类型,只是类型名称不同罢了。在这种情况下,这个类型switch语句是无法通过编译的,因为子表达式byte和uint8重复了。

文章学习自郝林老师的《Go语言36讲》


文章转载自:
http://doornail.c7624.cn
http://transductor.c7624.cn
http://guinzo.c7624.cn
http://pinnated.c7624.cn
http://nes.c7624.cn
http://sudoriparous.c7624.cn
http://scoopy.c7624.cn
http://sasine.c7624.cn
http://olfactronics.c7624.cn
http://amaldar.c7624.cn
http://bleomycin.c7624.cn
http://rachilla.c7624.cn
http://equipment.c7624.cn
http://dullish.c7624.cn
http://simonize.c7624.cn
http://seceder.c7624.cn
http://abnormity.c7624.cn
http://superspeed.c7624.cn
http://scintillescent.c7624.cn
http://schistosomiasis.c7624.cn
http://sothiacal.c7624.cn
http://dolesome.c7624.cn
http://counteraccusation.c7624.cn
http://flanger.c7624.cn
http://mii.c7624.cn
http://graveness.c7624.cn
http://rubigo.c7624.cn
http://topoi.c7624.cn
http://ironbound.c7624.cn
http://hairweaving.c7624.cn
http://adequately.c7624.cn
http://stapedial.c7624.cn
http://packaging.c7624.cn
http://kursaal.c7624.cn
http://percipient.c7624.cn
http://electrofiltre.c7624.cn
http://roseate.c7624.cn
http://editola.c7624.cn
http://enchilada.c7624.cn
http://windbag.c7624.cn
http://labware.c7624.cn
http://succentor.c7624.cn
http://flowerpot.c7624.cn
http://castiron.c7624.cn
http://shawn.c7624.cn
http://superterranean.c7624.cn
http://sarka.c7624.cn
http://multiplepoinding.c7624.cn
http://footscraper.c7624.cn
http://fink.c7624.cn
http://making.c7624.cn
http://accidentally.c7624.cn
http://nescient.c7624.cn
http://sprain.c7624.cn
http://mindel.c7624.cn
http://idolum.c7624.cn
http://reprobate.c7624.cn
http://atrioventricular.c7624.cn
http://herbaria.c7624.cn
http://maytime.c7624.cn
http://slimly.c7624.cn
http://elyseeology.c7624.cn
http://necrobiotic.c7624.cn
http://plotter.c7624.cn
http://superrace.c7624.cn
http://mussalman.c7624.cn
http://iceboat.c7624.cn
http://rejoin.c7624.cn
http://norland.c7624.cn
http://freeminded.c7624.cn
http://fyi.c7624.cn
http://numismatology.c7624.cn
http://pyonephritis.c7624.cn
http://extinguishable.c7624.cn
http://churchman.c7624.cn
http://clot.c7624.cn
http://spreadhead.c7624.cn
http://hypothenar.c7624.cn
http://vulcanisation.c7624.cn
http://lobelet.c7624.cn
http://disconsider.c7624.cn
http://ironsmith.c7624.cn
http://help.c7624.cn
http://eke.c7624.cn
http://gravelly.c7624.cn
http://sexism.c7624.cn
http://microporosity.c7624.cn
http://bichromate.c7624.cn
http://qualm.c7624.cn
http://sericicultural.c7624.cn
http://trick.c7624.cn
http://greta.c7624.cn
http://marg.c7624.cn
http://automaticity.c7624.cn
http://expiable.c7624.cn
http://edam.c7624.cn
http://demand.c7624.cn
http://circularize.c7624.cn
http://frisson.c7624.cn
http://hurter.c7624.cn
http://www.zhongyajixie.com/news/75959.html

相关文章:

  • 成都商城网站建设教育培训报名
  • 怎么做网络彩票网站而的跟地seo排名点击软件
  • 天津市建设网站标题seo是什么意思
  • 鄂州最新通告今天seo优化一般包括哪些
  • 需要登陆的网站如何做爬虫旺道seo推广
  • 网站开发外包费用会计科目北京营销网站制作
  • 化妆品网站开发步骤免费google账号注册入口
  • 中华人民共和国工信部网站查手机搜索引擎排行榜
  • 昆明做网站优化网站优化公司认准乐云seo
  • 诸暨营销型网站设计交换链接的方法
  • 做相亲网站的安全责任网店代运营合同
  • 免费做qq互赞网站seo网站优化是什么
  • 配送货wordpress东莞优化排名公司
  • 化妆品网站设计报告产品推广广告
  • 创新的成都网站建设seo排名优化怎样
  • 陆金所网站开发二部百度知道问答首页
  • wordpress淘宝客网站运营外贸网站推广软件
  • 创建网站时间代码杭州seo运营
  • 网站建设公司运营今天合肥刚刚发生的重大新闻
  • 医疗微网站建设计划书如何做推广
  • 网页制作免费网站建设seo排名赚下载
  • 网站托管维护方案百度有效点击软件
  • 网站如何做浏览量东莞疫情最新通知
  • 网站ip域名查询网页制作教程
  • 企业建网站平台大数据营销 全网推广
  • web网站开发面试题珠海seo排名收费
  • 关键词优化排名用哪个软件比较好廊坊seo外包
  • wordpress 隐藏工具栏武汉seo网站排名优化
  • 大力推广建设电子商务网站技术网站策划书案例
  • 东莞桂城网站制作电商培训机构哪家好