golang基础---Slice切片
切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别
定义一个空slice,格式
var s []int,这种既没有长度也没有元素赋值的类型(相比叫array)数组的基本操作如下 ,类似与python中列表切片的操作,详见实例
package main
import "fmt" func main() {
var s1 []int //这样就是一个slice类型,既没有长度也没有元素赋值
a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //这是一个数组
s2 := a[5:10] //切片,索引5到10的元素,不包含索引为10
s3 := a[:3] //切片,索引1-3的元素,不包含索引3
s4 := a[6:] //切片,第6个索引到最后一个索引的元素
s5 := a[:] //切片,复制一个数组
fmt.Println(s1)
fmt.Println(a)
fmt.Println(s2) //数组的切片,类似python
fmt.Println(s3)
fmt.Println(s4)
fmt.Println(s5)
} /*输出
s1---> []
a---> [0 0 0 0 0 0 0 0 0 0]
s2---> [6 7 8 9 10]
s3---> [1 2 3]
s4---> [7 8 9 10]
s5---> [1 2 3 4 5 6 7 8 9 10]
*/
使用make初始化一个slice类型,包含三个参数
①切片类型 []int
②初始长度 len
③容量 cap
package main
import "fmt" func main() {
s1 := make([]int, 3, 10) //使用make初始化一个slice,包含三个参数:①切片类型②初始长度③容量
fmt.Println(len(s1), cap(s1)) //输出长度,容量
fmt.Println(s1)
} /*输出:
len(s1)--->3
cap(s1)--->10
s1---> [0 0 0] //可变数组
*/
Reslice ,在原slice基础上再次切片,slice一个数组时,不仅取出了len,同时容量也会得到相应的切片。
示例
//Reslice,在slice基础上再次slice.
package main
import "fmt" func main() {
a := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'k', 'm'} //定义一个数组,元素为byte类型
sa := a[3:5] // slice切片,取索引三到五,不包含索引5
sb := sa[1:3]
fmt.Println(string(sa))
fmt.Println(len(sa), cap(sa))
fmt.Println(string(sb))
fmt.Println(len(sb), cap(sb))
} /*输出
sting(sa)---> de
len(sa)---> 2
cap(sa)---> 6
string(sb)---> ef
len(sb)---> 2
cap(sb)---> 5
*/
Append,类似python中list类型,使用append,从数组尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终长度未超过追加到slice的容量,则返回原始slice
如果超过追加的slice的容量则将重新分配数组并拷贝原始数据
package main
import "fmt" func main() {
s1 := make([]int, 3, 8) //初始化slice,长度位3,容量为8
fmt.Printf("%p\n", s1) //输出s1的内存地址
fmt.Println(s1)
s1 = append(s1, 1, 2, 3) //末尾追加三个元素,cap依然为8
fmt.Printf("%p\n", s1) //原来的slice
fmt.Println(s1)
s1 = append(s1, 1, 2, 3, 4) //继续追加元素,超过原s1容量,会重新分配新的内存地址
fmt.Printf("%p\n", s1) //cap容量超过8,为9
fmt.Println(s1)
} /*
p*s1---> 0xc042070040
s1---> [0 0 0]
p*s1s1--> 0xc042070040
s1---> [0 0 0 1 2 3]
p*s1---> 0xc04205e080 //新的内存地址
s1---> [0 0 0 1 2 3 1 2 3 4]
*/
当两个slice同时指向某一个数组时,改变某一个slice索引时,另一个slice索引值及原数组的索引也会改变
package main
import "fmt" func main() {
a := []int{1, 2, 3, 4, 5, 6}
s1 := a[2:5]
s2 := a[1:3]
fmt.Println(s1, s2)
s1[0] = 9
fmt.Println(s1, s2)
fmt.Println(a)
} /*
s1---> [3 4 5]
s2---> [2 3]
//更改s1的slice索引后,s2的索引也会改
s1---> [9 4 5]
s2---> [2 9]
a---> [1 2 9 4 5 6]
*/
copy,格式 copy(s1,s2), 将s2拷贝到s1数组中,当len(s1) > len(s2)时,最终将s2中的索引
替换掉s1的索引,当len(s1)<len(s2)时,s1的索引值全部被对应s2的索引替换
示例
package main
import "fmt" func main() {
s1 := []int{1, 2, 3, 4, 5}
s2 := []int{6, 7, 8}
copy(s1, s2) //将s2的元素拷贝到s1,s2
fmt.Println(s1) copy(s2, s1)
fmt.Println(s2) copy(s1, s2[2:3]) //只拷贝某一切片的索引
fmt.Println(s1)
} /*输出
s1---> [6 7 8 4 5]
s2---> [1 2 3]
s1---> [8 2 3 4 5]
*/
golang基础---Slice切片的更多相关文章
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- golang:slice切片
一直对slice切片这个概念理解的不是太透彻,之前学习python的就没搞清楚,不过平时就用python写个工具啥的,也没把这个当回事去花时间解决. 最近使用go开发又遇到这个问题,于是打算彻底把这个 ...
- 【玩转Golang】slice切片的操作——切片的追加、删除、插入等
一.一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){ var ss []string; fmt.Printf("length:%v \ta ...
- golang slice切片的原理以及内置函数cap, len
golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...
- golang slice 切片原理
golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...
- Golang基础之函数
golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...
- Golang 基础之基础语法梳理 (一)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...
- Golang基础教程
以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...
- Go语言基础之切片
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
随机推荐
- 解除SVN的控制
win10操作就是把文件夹隐藏的对勾勾上 然后就可以看见一个.SVN的文件夹 把他直接删除即可 然后刷新 自己亲测的 win10 家庭版
- sh脚本
通过. xxx.sh执行 经常在第一行加上#!/bin/bash,表示需要使用的bash shell环境 关于#!/bin/bash和#!/bin/sh 可以直接放linux命令 使用for循环 使用 ...
- Navicat for MySQL打开链接时出错错误为:2005 - Unknown MySQL server host 'localhost'(0)?
问题:Navicat for MySQL打开链接时出错错误为:2005 - Unknown MySQL server host 'localhost'(0)? 在使用navicat 连接mysql数据 ...
- 并行架构技术 EasyMR
EasyMR简介 一个并行计算软件框架 基于此框架的软件可以运行在多台计算机组成的计算集群上,并且每个计算机的计算任务也是多线程方式并行进行的,对于处理复杂的业务和巨量数据时非常用于. 有着MapRe ...
- “全栈2019”Java第五十五章:方法的静态绑定与动态绑定
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Django自带表User认证详解
认证登陆(附方法实现代码,百度网盘拉取即可下载,激活码:gqt1) 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然 ...
- while循环/格式化输出/ 逻辑运算/ 编码 /单位转换
一.while 循环 1. 循环 while 条件: 代码块(循环体) else: 当上面的条件为假. 才会执行 执行顺序: 判断条件是否为真. 如果真. 执行循环体. 然后再次判断条件....直到循 ...
- [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中任何节点
mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:阻止用户点击选中Tree中任何节点 ...
- [ActionScript 3.0] 处理xml内容换行时行间距较大问题的一种简单方法
我们一定遇到过这种情况,在读取xml里的文章内容时,一旦有换行的位置在flash里显示出来的行间距会比较大,而并非我们想要的效果,解决这个问题的方法除了使用正则表达式以外,这里介绍一种比较简单的方法, ...
- [redis] 数据特性简单实验
位图 由bit位组成的数组,实际的底层数组类型是字符串,而字符串的本质是二进制大对象,所以将其视作位图,位图存储的是boolean指,一定程度上可以减少存储空间. -- 设置位图指定偏移量的比特位的值 ...