博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经-Slice切片习题
阅读量:6654 次
发布时间:2019-06-25

本文共 2946 字,大约阅读时间需要 9 分钟。

1.Slice(切片)代表变长的序列,序列中每个元素都有相同的类型,一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice的底层确实引用一个数组对象

2.内置的len和cap函数分别返回slice的长度和容量

3.s[i:j] , 从第i个元素开始到第j-1个元素的子序列,s[:]切片操作则是引用整个数组

4.slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素

5.将slice元素循环向左旋转n个元素的方法是三次调用reverse反转函数,第一次是反转开头的n个元素,然后是反转剩下的元素,最后是反转整个slice的元素。

6.slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等元素,slice唯一合法的比较操作是和nil比较

7.可以用[]int(nil)类型转换表达式来生成一个对应类型slice的nil值

8.测试一个slice是否是空的,使用len(s) == 0来判断

9.make函数创建一个指定元素类型、长度和容量的slice , make([]T, len)

10.内置的append函数用于向slice追加元素

11.[]rune("Hello, 世界")  字符串转rune类型的slice

12.我们并不知道append调用是否导致了内存的重新分配,因此我们也不能确认新的slice和原始的slice是否引用的是相同的底层数组空间,通常是将append返回的结果直接赋值给输入的slice变量

13.函数参数中的最后的“...”省略号表示接收变长的参数为slice,func appendInt(x []int, y ...int) []int {}

14.报错invalid indirect of s[j] (type int) ,使用数组指针的时候(*s)[0]

15.Slice内存技巧,

练习 4.3: 重写reverse函数,使用数组指针代替slice。

 

练习 4.4: 编写一个rotate函数,通过一次循环完成旋转。

 

练习 4.5: 写一个函数在原地完成消除[]string中相邻重复的字符串的操作。

 

练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回

 

练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?

package mainimport(        "fmt"        "unicode")func main(){        testArr := [5]int{0,1,2,3,4}        //reverse(&testArr)        fmt.Println(testArr)        a:=rotate(testArr[:],2)        fmt.Println(a)        b:=[]string{"tao","taoshihan","shi","shi","han"}        emptyString(b)        d:=[]byte("abc bcd wer  sdsd  taoshihan     de")        e:=emptyString2(d)        fmt.Println(string(e))        f:=[]byte("abc bcd wer  sdsd  taoshihan     de")        reverse1(f)        fmt.Println(string(f))}/*练习 4.3: 重写reverse函数,使用数组指针代替slice。*/func reverse(s *[5]int){        i,j := 0,len(*s)-1;        for i
=lens{ index=index-lens } res[i] = s[index] } return res }/*练习 4.5:写一个函数在原地完成消除[]string中相邻重复的字符串的操作。*/func emptyString(s []string)[]string{ i:=0 index:=0 num := len(s) for _,v :=range s{ index =i+1 if index>=num{ break } if v != s[index]{ s[i]=v i++ } } fmt.Println(s[:i]) return s[:i]}/*练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回*/func emptyString2(s []byte)[]byte{ index:=0 num := len(s) for i:=0;i
=num{ break } if unicode.IsSpace(rune(s[i])) && unicode.IsSpace(rune(s[index])){ //结合remove函数 copy(s[i:],s[index:]) s=s[:len(s)-1] i-- } } return s}/*练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?*/func reverse1(s []byte) { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j], s[i] }}

  

转载地址:http://otjto.baihongyu.com/

你可能感兴趣的文章
spring aop记录日志
查看>>
还有人不认识通讯诈骗,短信验证码带你认识一下
查看>>
Docker(四)镜像创建
查看>>
unigui的UnimDatePicker控件使用经验
查看>>
C# 自定义堆栈进行回文检测的代码
查看>>
采用负责任的人工智能推动业务价值
查看>>
比较实用的wamp配置多站点方法
查看>>
用maven时出现,报错 miss 一些包,但是发现项目里已经引入了,但还是报错
查看>>
Servlet中ServletConfig和ServletContext漫谈
查看>>
为那些在职准备考IE的兄弟们做个参考-乾颐堂张IE执笔
查看>>
JQ中 $(document).scrollTop()、$('html').scrollTop()、 $(window).scrollTop()区别
查看>>
我的友情链接
查看>>
令人眼前一亮的下拉式终端 Tilda & Guake
查看>>
find
查看>>
注册 功能的实现
查看>>
Python - 元组(tuple) 详解 及 代码
查看>>
AsynchronousSocketChannel
查看>>
Linux系统下卸载MySQL(靠谱)
查看>>
IE6尾部重复字符bug , IE6下产生多余字符的BUG
查看>>
ruby学习笔记-基础数据类型
查看>>