golang系列的文章包含多篇文章,总篇如下,其中包含各篇文章的指引

明月映江雪:golang系列——个人学习笔记总篇​zhuanlan.zhihu.com

由于最近事情比较多,拖到现在才更新,另一方面,原计划这一章的内容将包括select、channel、方法、切片、范围、集合和接口等内容,但是实际写的时候才发现这根本是痴人说梦,所以将这些内容拆分讲解。那直接进入主题吧,本文将初步讲解slice有关的内容,如果同学们需要更详细的讲解,可以参考官方或其他资料,并欢迎大家一起讨论。

slice——切片

高中生物观察叶绿体时就有切片操作,即将叶片的组织切出薄薄的一片进行观察。同理,golang中的切片可以理解为切取内存的一部分,也可以类比数组的某一个连续的空间。slice在golang的实现主要与3个元素相关:指针、长度和容量。

  • 指针:指向某存储数据的连续内存空间,简单的说就是你要在哪儿切;
  • 长度:需要切的元素的数量,简单的说就是你要切多少;
  • 容量:最多能切的元素的数量,简单的说就是最多切多少,一点也不能多切。

切片的基本操作

var sliceTmp []int                            //声明,空切片,长度和容量都是0,指针为nil
sliceTmp2 := []string{"a","b","c"}       //初始化,长度和容量都是3
sliceTmp2[0] = "b"                          //修改sliceTmp2为"b","b","c"
sliceTmp2 = append(sliceTmp2,"d")  //添加元素 "b","b","c","d"
var sliceTmp3 []string = sliceTmp2   //切片拷贝

大家要记住:在任意基础切片上进行操作,如果生成新的切片和基础切片公用内存空间,那么修改公共内存空间的内容将影响所有使用该段公共内存空间的变量。下面给大家举个例子:

sliceTmp4 := []int{1,2,3,4,5,6}     //长度为6,容量为6
var sliceTmp5 = sliceTmp4[1:4]  //[2,3,4] sliceTmp5指针指向sliceTmp4[1],长度为3,容量为3//此时sliceTmp4和sliceTmp5公用[2,3,4]的内存空间
sliceTmp5[1] = 0

按照普遍逻辑,sliceTmp4理应是[1,2,3,4,5,6], sliceTmp5是[2,0,4],但实际上,sliceTmp4变成[1,2,0,4,5,6],仿佛在修改sliceTmp5的时候把sliceTmp4也修改了。实际上,sliceTmp4和sliceTmp5使用同一段内存空间注意:不能如下所示定义切片

var test []int{1,2,3,4,5,6}

但是可以使用make内建函数主动创建一个切片,如下所示,申请存储int型数据的切片,长度和容量为3和4。

var test [] int = make([]int,3,4)     //注意,使用make后已经存在3个元素,make([]int,0,4)则无元素

我们也可以用如下方式获取切片的长度和容量:

len(test)    //3
cap(test)   //4

切片的扩容

切片是支持动态扩容的,扩容的办法有2个:复制和追加

//复制, 新的slice为原来的2倍,先申请一个2倍的空间newSlice := make([]int, len(test),(cap(test)+1)*2) //避免test的容量为0copy(newSlice, test)
//追加, 可以直接在test上追加test = append(test,1,2,3) //长度和容量都加3newSlice = append(test,1,2,3) //newSlice为新的变量,与test没有公用空间
//一种特殊的追加方法,或者称之为合并操作s1 := []int{1,1}s2 := []int{2,2}s3 := append(s1,s2...) //[1,1,2,2]

切片的使用中容易出现内容公用的情形,但是只要在使用slice的时候时刻考虑切片的三个要素:指针、长度和容量,就能排查出异常的公用,否则牵一发而动全身,所有有公用内存的变量都会被改动。

切片的遍历

方法一:数组索引

for i:=0; i<len(s1); i++{doSomething
}

方法二:range

for index, value :=range s1{doSomething
}

函数传参

一般在函数传参时,我们都要尤其注意参数是传值还是传地址。在golang语言中函数传参是传值的,但是在传递切片时有点不一样。由于切片是由三个参数共同影响的,其中指针在传递后依旧为原指针,即拷贝后仍然指向同一个地址,所以当切片为参数时,原切片依然可能被函数内的操作所影响,这一点尤其要注意。

内存浪费

如前文所说,在某个基础切片上进行多次操作后,则可能产生很多个切片。假设基础切片的长度为1W,而新产生的切片长度为10,如果基础切片不会再被使用,那么建议申请长度为10的空间存储新的切片,这样基础切片就能被回收,否则将长期驻留在内容中,造成浪费。

golang 切片 接口_一日看尽golang高级语法之slice相关推荐

  1. golang 切片 接口_如何理解Golang中的接口?

    个人认为,要理解 Go 的接口,一定先了解下鸭子模型. 鸭子模型 那什么鸭子模型? 鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力.游泳起来像鸭子.叫起来也像鸭子 ...

  2. golang 切片 接口_Go 经典入门系列 18:接口(一)

    点击上方蓝色"Go语言中文网"关注,每天一起学 Go 欢迎来到 Golang 系列教程[1]的第 18 个教程.接口共有两个教程,这是我们接口的第一个教程. 什么是接口? 在面向对 ...

  3. golang 切片 接口_Go编程模式:切片,接口,时间和性能

    在本篇文章中,我会对 Go 语言编程模式的一些基本技术和要点,这样可以让你更容易掌握 Go 语言编程.其中,主要包括,数组切片的一些小坑,还有接口编程,以及时间和程序运行性能相关的话题. 本文是全系列 ...

  4. golang 切片 接口_Golang简单入门教程——函数进阶使用

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...

  5. golang 切片 接口_Golang语言常用关键字之 make 和 new

    上一章中对于golang的语言基础说明如下: 1 函数调用 2 接口 3 反射 接下来我们来对golang的常用关键字进行说明,主要内容有: 1. for 和 range 2. select 3. d ...

  6. golang 操作日期_使用Godate在Golang中轻松进行日期操作

    golang 操作日期 by Kofo Okesola 由Kofo Okesola 使用Godate在Golang中轻松进行日期操作 (Easy date manipulation in Golang ...

  7. dock接口_回看手机接口发展史:TypeC将实现大一统?

    手机在近几年发展飞快,从当年大哥大逐步演变到体积越来越小,续航能力越来越强,超级快充也变成了常规配置,而手机的充电接口也在不断地发生改变,下面我们不妨回顾一下,这些年来手机插口的发展史. 现在常用的手 ...

  8. java 8 函数式接口_必看:通俗易懂地告诉你什么是java8中的“函数式接口”

    花10分钟认真的看完一篇文章,或许会有意想不到的收获 java8发布已经好几年了,相信很多小伙伴都使用过java8,java8这版本带来了很多新特性,其中一个就是"函数式接口",今 ...

  9. golang mysql封装_自己封装的golang 操作数据库方法

    这个是我用Go写的第一个东东,可能还存在些BUG没有测试到.这里主要是提供一个参考.各位可以改写成自己的风格. 在命令行下输入如下两条命令,进行安装 go get github.com/male110 ...

最新文章

  1. Blender从头到尾创建一辆宝马轿车视频教程
  2. 所有 SAP 现在开设的标准课程
  3. SOCKS代理工具EarthWorm、sSoks
  4. selenium2与python自动化6-select下拉框
  5. 【深度学习】实战深度学习检测疟疾
  6. Java开发2018年值得学习的10大技术
  7. 详解Go语言的计时器
  8. 解析nextTick---vue3任务调度
  9. 16.6 假新闻识别 Fake News Detection on Social Media A Data Mining Perspective
  10. IV.Indexes(索引)
  11. 分享小知识:善用Group By排序
  12. 韩顺平循序渐进学java 第18讲 查找
  13. Apabi Reader-强大的免费pdf文档阅读器(方正出品)
  14. 2020年最新 java JDK 11 下载、安装与环境变量配置教程
  15. FlashFXP连接失败(连接已拒绝)及530 permission denied(连接已被客户端关闭)
  16. Lottie动画概述,文末有彩蛋
  17. vue3 + router-view + keepalive parentComponent.ctx.deactivate is not a function
  18. 什么是现金流游戏?_富爸爸_新浪博客
  19. 代理服务器导致连接不上局域网问题
  20. 游泳过后,耳朵进水怎么办,中耳进水

热门文章

  1. python类继承可以有多个父类_Python3基础 多重继承 一个子类继承于多个父类
  2. php 上传文件漏洞,【文件上传】PHP文件上传漏洞
  3. Misc-wireshark-1(秒懂!!)
  4. Python内置函数大全
  5. Python创建一个循环链表、双向循环链表
  6. Python如何存储数据到json文件
  7. Python动态绑定属性和方法
  8. 计算机进入安全模式,电脑怎么进入安全模式
  9. androidsdktools安装_如何命令行安装Android SDK Build Tools(构建工具)?
  10. html5语义化标签marquee,高效书写HTML5,快速提升你的编码效率!