Golang切片的三种简单使用方式及区别

概念

切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构。切片并不存储任何元素而只是对现有数组的引用。

三种方式及细节案例

①定义一个切片,然后让切片去引用一个已经创建好的数组

package main
import ("fmt"
)func main() {var arr [5]int = [...]int {1, 2, 3, 4, 5}var slice = arr[1:3]fmt.Println("arr=", arr)fmt.Println("slice=", slice)fmt.Println("slice len", len(slice))fmt.Println("slice cap", cap(slice))
}

②通过make来创建切片。基本语法:var 切片名 []type = make([], len, [cap]);参数说明:type是数据类型、len是大小、cap是切片容量(容量必须>=长度)

  1. 通过make方式创建切片可以指定切片大小和容量
  2. 如果没有给切片的各个元素赋值,那么就会使用默认值(int、float=>0, strint=>"", bool=>false)
  3. 荣国make方式创建的切片对应的数组是由make底层维护,对外不可见,也就是只能通过slice访问各个元素
package main
import ("fmt"
)func main() {var slice []float64 = make([]float64, 5, 10)//没有给值,默认都是0fmt.Println(slice)  //[0 0 0 0 0]//赋值slice[1] = 5slice[3] = 10  fmt.Println(slice)  //[0 5 0 10 0]
fmt.Println("slice大小:", len(slice)) //slice大小: 5fmt.Println("slice容量:", cap(slice)) //slice容量: 10
}

③定义一个切片,直接就指定具体数组,使用原理类似于make的方式

package main
import ("fmt"
)func main() {var slice []string = []string{"zhangsan", "lisi", "wangwu"}fmt.Println("slice=", slice) //slice= [zhangsan lisi wangwu]fmt.Println("slice len", len(slice)) //slice len 3fmt.Println("slice cap", cap(slice)) //slice cap 3
}

 第一种和第二种的区别

第一种方式是直接引用数组,这个数组是事先存在的,程序员可见
第二种方式是通过make来创建切片,make也会创建一个数组,是由切片在底层维护,程序员不可见

补充:零碎案例

package main
import "fmt"
func main() {// 和数组不同的是,切片的长度是可变的。// 我们可以使用内置函数make来创建一个长度不为零的切片// 这里我们创建了一个长度为3,存储字符串的切片,切片元素// 默认为零值,对于字符串就是""。s := make([]string, 3)fmt.Println("emp:", s)// 可以使用和数组一样的方法来设置元素值或获取元素值s[0] = "a"s[1] = "b"s[2] = "c"fmt.Println("set:", s)fmt.Println("get:", s[2])// 可以用内置函数len获取切片的长度fmt.Println("len:", len(s))// 切片还拥有一些数组所没有的功能。// 例如我们可以使用内置函数append给切片追加值,然后// 返回一个拥有新切片元素的切片。// 注意append函数不会改变原切片,而是生成了一个新切片,// 我们需要用原来的切片来接收这个新切片s = append(s, "d")s = append(s, "e", "f")fmt.Println("apd:", s)// 另外我们还可以从一个切片拷贝元素到另一个切片// 下面的例子就是创建了一个和切片s长度相同的新切片// 然后使用内置的copy函数来拷贝s的元素到c中。c := make([]string, len(s))copy(c, s)fmt.Println("cpy:", c)// 切片还支持一个取切片的操作 "slice[low:high]"// 获取的新切片包含元素"slice[low]",但是不包含"slice[high]"// 下面的例子就是取一个新切片,元素包括"s[2]","s[3]","s[4]"。l := s[2:5]fmt.Println("sl1:", l)// 如果省略low,默认从0开始,不包括"slice[high]"元素l = s[:5]fmt.Println("sl2:", l)// 如果省略high,默认为len(slice),包括"slice[low]"元素l = s[2:]fmt.Println("sl3:", l)// 我们可以同时声明和初始化一个切片t := []string{"g", "h", "i"}fmt.Println("dcl:", t)// 我们也可以创建多维切片,和数组不同的是,切片元素的长度也是可变的。twoD := make([][]int, 3)for i := 0; i < 3; i++ {innerLen := i + 1twoD[i] = make([]int, innerLen)for j := 0; j < innerLen; j++ {twoD[i][j] = i + j}}fmt.Println("2d: ", twoD)
}
//结果
emp: [  ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d:  [[0] [1 2] [2 3 4]]

 

转载于:https://www.cnblogs.com/wt645631686/p/9637311.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这样给数组初始化,你肯定没有见过

今天在朋友圈看到一个朋友发的图片是给数组初始化的代码截图如下&#xff1a;我看到这个代码&#xff0c;也让我着实惊了一下&#xff0c;写代码这么久&#xff0c;也没有见过这样子初始化的。这个代码是出自海思的SDK里面的&#xff0c;华为的大牛还是很多啊&#xff0c;学习C…

如何让自己升薪

1) 经理应该好好看一看年度工作总结&#xff0c;这样他就能知道我对同事提供了多大的帮助。 2)如果一个程序员的工作很容易完成&#xff0c;那就不要等他主动来索取更多的任务。相反&#xff0c;积极交给他更加有挑战性的复杂的任务。 3) 在谈话中不要阻止建设性的批评。这个经…

ARM知识点

1、ARM有几种工作模式&#xff1f; 答&#xff1a;有7个基本工作模式&#xff1a;用户模式&#xff08;user&#xff09;、系统模式&#xff08;system&#xff09;、数据访问中止模式&#xff08;abort&#xff09;、未定义指令中止模式&#xff08;undef&#xff09;、快速中…

《你不知道的JavaScript》中卷 KYLE SIMPSON 著 单业 姜南 译

一部分 类型和语法 1.内置类型&#xff08;7&#xff09; null、undefined、boolean、number、string、object、symbol(ES6新增&#xff0c;符号) 2.toString()和Json.stringify() (1)字符串、数字、布尔值和null的JSON.stringify()规则与toString基本相同 (2)如果传递给JSON.…

CP命令引发的思考

转自&#xff1a;OSC开源社区今天同事用 cp 命令&#xff0c;把他给惊到了&#xff01;背景是这样的&#xff1a;他用 cp 拷贝了一个 100 G的文件&#xff0c;竟然一秒不到就拷贝完成了&#xff01;用 ls 看一把文件&#xff0c;显示文件确实是 100 G。sh-4.4# ls -lh -rw-r-…

安装windows XP或者2003时提示找不到硬盘驱动器的解决办法(总结)转载

&#xff08;本文属于转载&#xff09; 由于SATA接口在近年才推出&#xff0c;Windows XP问世的时候&#xff0c;还没有它&#xff0c;所以安装Windows XP时&#xff0c;需要调用SATA驱动程序&#xff0c;而你又没有提供相应的驱动&#xff0c;就会出现无法识别硬盘的错误。 不…

C宏定义注意事项

1、带参数的宏与函数的优缺点 2、宏定义一个函数时&#xff0c;需要注意每个参数都需要用括号括起来。 如&#xff1a;#define Min(a,b) ((a)<(b)?(a):(b)) 3、宏定义一年中的秒数 #define SECONDE_OF_YEAR 606024365UL &#xff08;√&#xff09; #define SECONDE_OF_YE…

不要再来北上广深了

大家好&#xff0c;我是写代码的篮球球痴最近我们的一个离职群里面讨论一个问题&#xff0c;就是在北上广深工作的性价比问题&#xff0c;我有几个同事这样描述。一线城市确实会遇到一些机会&#xff0c;也有可能会遇到一些改变命运的机会。不过对于生活来说&#xff0c;一线城…

mogndb 慢查询

0 摘要 在MySQL中&#xff0c;慢查询日志是经常作为我们优化查询的依据&#xff0c;那在MongoDB中是否有类似的功能呢&#xff1f;答案是肯定的&#xff0c;那就是开启Profiling功能。该工具在运行的实例上收集有关MongoDB的写操作&#xff0c;游标&#xff0c;数据库命令等&a…

Linux命令中正则表达式的运用

一、正则表达式简介 事实上&#xff0c;正则表达式不仅适用于linux&#xff0c;多种编程语言中也可以使用到它&#xff0c;因为它实际上是人们对于某种规律的表达方式。 如果要把他的所有应用都讲上的话那这篇文章会变的太长以至于无法阅读&#xff0c;我只介绍他在linux下和几…

程序的内存分配模式(堆栈以及静态存储区,文字常量区,代码区)

程序的内存分配模式 一个由 C/C编译的程序占用的内存分为以下几个部分&#xff1a; 1、栈区&#xff08; stack &#xff09;—由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量的值 等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08; heap&a…

稚晖君教你制作全球最迷你的自平衡机器人

摘要&#xff1a;Nano是一个小巧可爱的机器人&#xff0c;身高大约10公分&#xff0c;特点是平衡感好&#xff0c;长得很白以及善于卖萌。作为全球最迷你的自平衡机器人&#xff0c;Nano身材虽小&#xff0c;但配置有丰富的传感器—陀螺仪&#xff0c;超声波&#xff0c;Motion…

9.13作业

2、python test.py执行的三个阶段是什么&#xff1f;在哪个阶段识别文件内的python语法&#xff1f; 先运行python解释器&#xff0c;将python文件从硬盘读取到内存&#xff0c;解释执行内存读取的代码&#xff0c;开始识别python语法。 在第3个阶段识别文件内的python语法 3、…

tomcat 6.0环境, 网页超链接,文件下载另存为时,不能识别msi文件类型,另存为只能选htm和所有文件。...

问题: tomcat 6.0环境&#xff0c; 网页超链接&#xff0c;文件下载另存为时&#xff0c;不能识别msi文件类型&#xff0c;另存为只能选htm和所有文件。 解决办法:在 ...\Tomcat 6.0\conf 文件夹下的 web.xml 文件中添加以下类型声明:<mime-mapping><extension>msi…

ARM不同位数系统int字节数区别

32位和64位系统区别及int字节数 一&#xff09;64位系统和32位有什么区别&#xff1f; 1、64bit CPU拥有更大的寻址能力&#xff0c;最大支持到16GB内存&#xff0c;而32bit只支持4G内存 2、64位CPU一次可提取64位数据&#xff0c;比32位提高了一倍&#xff0c;理论上性能会…

我的广州大伯

2021年11月24日我正在办公室和同事调试项目&#xff0c;突然接到我婶的微信语音电话&#xff0c;我婶说广州的大伯过世了&#xff0c;他们现在正在去大伯家的路上。我大伯是爷爷奶奶最大的儿子&#xff0c;爷爷奶奶在世时&#xff0c;家里的很多事情&#xff0c;都会和大伯商量…

VUE 入坑系列 一 双向绑定

html代码<div id"app"><p>{{message}}</p><span>message1</span> <input v-model"message"><span>message2</span> <input v-model"message"></div> View Codejavascript代码var …

semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机

使用ITM机制实现调试stm32单片机&#xff0c;实现printf与scanf。 ITM简介 ITM机制是一种调试机制&#xff0c;是新一代调试方式&#xff0c;在这之前&#xff0c;有一种比较出名的调试方式&#xff0c;称为半主机&#xff08;semihosting&#xff09;方式。 在pc上编写过C语…

spring+ibatis配置

spring-dao.xml配置 <bean id"sqlMapClient" class"org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name"configLocation" value"classpath:/sql-map-config.xml"/> <property…

5毛钱搞一个2.4GHz射频信号探测器

射频电子领域神秘而又朦胧&#xff0c;今天我们通过一个小小的射频检波电路来体验一下射频世界的魅力。实验目的制作一个 2.4 GHz 射频信号探测器&#xff0c;电路简单总成本不到 5 毛钱。该电路在靠近 2.4 GHz 无线信号时 LED 灯会闪烁。这是我用制作好的 2.4 GHz 射频信号靠近…