Golang切片的三种简单使用方式及区别
概念
切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构。切片并不存储任何元素而只是对现有数组的引用。
三种方式及细节案例
①定义一个切片,然后让切片去引用一个已经创建好的数组
package main
import (
"fmt"
) func main() {
var arr []int = [...]int {, , , , }
var slice = arr[:]
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是切片容量(容量必须>=长度)
- 通过make方式创建切片可以指定切片大小和容量
- 如果没有给切片的各个元素赋值,那么就会使用默认值(int、float=>0, strint=>"", bool=>false)
- 荣国make方式创建的切片对应的数组是由make底层维护,对外不可见,也就是只能通过slice访问各个元素
package main
import (
"fmt"
) func main() {
var slice []float64 = make([]float64, , )
//没有给值,默认都是0
fmt.Println(slice) //[0 0 0 0 0] //赋值
slice[] =
slice[] =
fmt.Println(slice) //[0 5 0 10 0] fmt.Println("slice大小:", len(slice)) //slice大小: 5
fmt.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 3
fmt.Println("slice cap", cap(slice)) //slice cap 3
}
第一种和第二种的区别
第一种方式是直接引用数组,这个数组是事先存在的,程序员可见
第二种方式是通过make来创建切片,make也会创建一个数组,是由切片在底层维护,程序员不可见
补充:零碎案例
package main
import "fmt"
func main() { // 和数组不同的是,切片的长度是可变的。
// 我们可以使用内置函数make来创建一个长度不为零的切片
// 这里我们创建了一个长度为3,存储字符串的切片,切片元素
// 默认为零值,对于字符串就是""。
s := make([]string, )
fmt.Println("emp:", s) // 可以使用和数组一样的方法来设置元素值或获取元素值
s[] = "a"
s[] = "b"
s[] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[]) // 可以用内置函数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[:]
fmt.Println("sl1:", l) // 如果省略low,默认从0开始,不包括"slice[high]"元素
l = s[:]
fmt.Println("sl2:", l) // 如果省略high,默认为len(slice),包括"slice[low]"元素
l = s[:]
fmt.Println("sl3:", l) // 我们可以同时声明和初始化一个切片
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t) // 我们也可以创建多维切片,和数组不同的是,切片元素的长度也是可变的。
twoD := make([][]int, )
for i := ; i < ; i++ {
innerLen := i +
twoD[i] = make([]int, innerLen)
for j := ; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
//结果
emp: [ ]
set: [a b c]
get: c
len:
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: [[] [ ] [ ]]
Golang切片的三种简单使用方式及区别的更多相关文章
- spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)
一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...
- java倒计时三种简单实现方式
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- (转) linux虚拟机中和主机三种网络连接方式的区别
在介绍网络模式之前,关于网络的几个简单命令的使用 ifup eth0 //启动网卡eth0 ifdown eth0 //关闭网卡eth0 /etc/network/interfaces //网络 ...
- python——remove,del,pop三种删除元素方式的区别
记性不好,整理出来以作保存 1.remove ①直接删除元素,remove(obj),顺序删除第一个遇到的,所以想要全部删除 ,需要遍历 aList = [123, 'xyz', 'zara', 'a ...
- .NET中的三种接口实现方式
摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探
更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...
- Linux虚拟机的三种网络连接方式
Linux虚拟机的三种网络连接方式 虚拟机网络模式 无论是vmware,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式: 1.桥接 2.NAT 3.Host- ...
- LVS:三种负载均衡方式比较
[转自http://soft.chinabyte.com/25/13169025.shtml] 1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西, ...
随机推荐
- maven 详解二
转自 http://www.cnblogs.com/whgk/p/7121336.html 前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ss ...
- CentOS6.5安装Tomcat8.0
1.首先从官网下载最新的安装包 http://tomcat.apache.org/ apache-tomcat-8.0.20.tar.gz 2.上传安装包到 /usr/local/mypackage ...
- 20165321实验一 Java开发环境的熟悉
一.idea调试: 二.实验内容: 实现学生成绩管理功能(增删改,排序,查找),并进行测试(正常情况,异常情况,边界情况). 运行截图: 代码: public class Student { Stri ...
- vim 常用
Format JSON :%!python -m json.tool 1. define custom function and use it define function in .vimrc fu ...
- cocos2d JS 创建实现换行功能的聊天文本 testLable
-- 创建实现换行功能的文本 function LoadLabelHeroIntroduce(objLabelContent) //传入文本 ---------------------------- ...
- spring注解式开发之视图解析器
http://localhost:8089/springmvc-04-viewResovler/springmvc/hello
- summaryなな
Word如果遇到有空白页不能删除的情况,将光标定位在空白页前一页的末尾,然后按Delete键就可以删除空白页了. 实时计算,强调的是实时.比如小明要查看他去年一年的消费总额度,那么当小明点下统计按钮的 ...
- Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
很明显应该是HADOOP_HOME的问题.如果HADOOP_HOME为空,必然fullExeName为null\bin\winutils.exe.解决方法很简单,配置环境变量,不想重启电脑可以在程序里 ...
- hessian 在spring中的使用 (bean 如 Dao无法注入的问题)
hessian的主要结构分客户端与服务端,中间基于http传输.客户端主要做的事情是把对远程接口调用序列化为流,并传输到服务端:服务端主要做的事情是把传输过来的流反序列化为对服务的请求,调用相应服务后 ...
- DBA角色职责
MySQL DBA分架构DBA,运维DBA和开发DBA三种角色,职责介绍如下: MySQL数据库系统日常管理职责 日常管理的主要职责是对MySQL服务器程序mysqld的运行情况进行管理,使数据库用户 ...