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 main
import(
"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<j{
(*s)[i],(*s)[j]=(*s)[j],(*s)[i]
i+=1
j-=1
}
}
/*
练习 4.4: 编写一个rotate函数,通过一次循环完成旋转。
*/
func rotate(s []int,r int)[]int{
lens := len(s)
//创建一个空的指定长度的slice
res :=make([]int, lens)
for i:=0 ;i<lens;i++{
index := i+r
if index>=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;i++{
index =i+1
num = len(s)
if index>=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]
}
}

  

[日常] Go语言圣经-Slice切片习题的更多相关文章

  1. [日常] Go语言圣经-匿名函数习题

    Go语言圣经-匿名函数1.拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值2.通过这种方式定义的函数可以访 ...

  2. [日常] Go语言圣经--接口约定习题

    Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...

  3. [日常] Go语言圣经-错误,函数值习题

    Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...

  4. [日常] Go语言圣经-字节切片与字符串

    1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...

  5. [日常] Go语言圣经--接口约定习题2

    练习 7.3: 为在gopl.io/ch4/treesort (§4.4)的*tree类型实现一个String方法去展示tree类型的值序列. package main import( "f ...

  6. [日常] Go语言圣经-可变参数习题

    1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像 ...

  7. [日常] Go语言圣经-竞争条件习题

    package main import( "fmt" "sync" ) var balance int func Deposit(amount int) { b ...

  8. [日常] Go语言圣经-匿名函数习题2

    练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面.只保存来自原始域名下的页面.假设初始页面在golang.org下,就不 要保存vimeo.com下的页面. p ...

  9. [日常] Go语言圣经-函数递归习题

    练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...

随机推荐

  1. 利用GDI+处理图像的色彩

    首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[][]; } ColorMatrix; ColorMatrix结构体一般和I ...

  2. 那些好用的阅读软件(Windows & Android)

    此文章已添加预览与更新,请您移步到我的新博客 http://t.cn/EXCiCTE 整个2018年就没写过几篇博文,所以写一篇文章算过年啦-哈哈-有部分软件因为年代原因,官网已经消失.或者网络上的资 ...

  3. 【WEB前端】CSS书写规范

    古语有云:不以规矩,不成方圆.不管是国还是家还是...都得有规矩加以约束.同样,在我们程序猿的代码中也有一定的规矩——W3C标准,但是我今天不会讲那么高深的道理,我只想说说,我近些日子在开发中所总结出 ...

  4. 【转】Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法

    原文:https://blog.csdn.net/sweety820/article/details/79538973 更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5 ...

  5. 【文文殿下】[AH2017/HNOI2017]礼物

    题解 二项式展开,然后暴力FFT就好了.会发现有一个卷积与c无关,我们找一个最小的项就行了. Tips:记得要倍长其中一个数组,防止FFT出锅 代码如下: #include<bits/stdc+ ...

  6. Linux学习笔记-基本操作4

    1. gdb调试2. makefile的编写3. 系统IO函数 1. gdb调试:        1. 启动gdb + 可执行文件        2. 查看代码:                l== ...

  7. 机器学习基石笔记:15 Validation

    一.模型选择问题 如何选择? 视觉上 NO 不是所有资料都能可视化;人脑模型复杂度也得算上. 通过Ein NO 容易过拟合;泛化能力差. 通过Etest NO 能保证好的泛化,不过往往没法提前获得测试 ...

  8. elasticsearch5.6.3插件部署

    需要注意的是,5.x和2.x插件方面改动很大.参考:https://www.elastic.co/blog/running-site-plugins-with-elasticsearch-5-0.因为 ...

  9. [Spring]@Autowired,@Required,@Qualifier注解

    @Required注解 @Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值 假设有个测试类,里面有name和password两个属性 我给两个属性的setter方法 ...

  10. Vim实用技巧系列 - 利用百度云和git实现vim配置多机共享

    Vim是一个强大的文本编辑器.良好的配置更能便利对Vim的使用.有时候,我们会在几台不同的电脑上使用Vim. 例如,我们可能在自己的电脑和公司的电脑上都安装了Vim. 有时候,我们需要实现,如果我们配 ...