package main

import "fmt"

/*
切片:
不定长的数组,是引用类型的数据,指向一个底层数组。
*/
func main() {
//切片的创建和访问
var s1 []int
fmt.Println(s1) s2 := []int{1, 2, 3, 4}
fmt.Println(s2)
s2[0] = 5
fmt.Println(s2) s3 := make([]int, 3)
/*
make函数可以创建slice,map,chan这三种引用类型
第一个参数是类型,第二个参数是长度len,第三个参数是容量cap(这里省略了)
*/
fmt.Println(s3) //切片扩容append
s3 = append(s3, 1, 2)
fmt.Println(s3)
s3 = append(s3, s2...) //append另一个切片中的元素
fmt.Println(s3) //遍历切片
for i := 0; i < len(s2); i++ {
fmt.Println(s2[i])
} for i, v := range s2 {
fmt.Println(i, v)
} //切片扩容原理
/*
新建一个len=3,cap=3的切片
append两个值时,这时切片指向一个新的cap=6的底层数组,并把前一个数组的值复制给新数组。
元素个数再次增大超过6时,成倍扩容为cap=12。
slice本身不存储数据,指向的数组存储数据,切片变化cap靠改变指向的数组实现。
*/
sli1 := make([]int, 3)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1)
sli1 = append(sli1, 1, 2)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1)
sli1 = append(sli1, 3, 4)
fmt.Printf("len:%d,cap:%d,切片地址:%p,数组地址:%p\n", len(sli1), cap(sli1), &sli1, sli1) //在已有array上直接创建slice
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sli2 := arr[:5] //1-5
sli3 := arr[3:8] //4-8
sli4 := arr[5:] //6-10
sli5 := arr[:] //1-10
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli2), cap(sli2), sli2)
fmt.Println("sli3:", sli3)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli3), cap(sli3), sli3)
fmt.Println("sli4:", sli4)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli4), cap(sli4), sli4)
fmt.Println("sli5:", sli5)
fmt.Printf("len:%d,cap:%d,数组地址:%p\n", len(sli5), cap(sli5), sli5)
//更改数组或切片内容
fmt.Println("=========更改数组==========")
arr[7] = 100
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========更改切片==========")
sli2[4] = 200
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========append切片(未超过数组cap)==========")
sli2 = append(sli2, 0, 0, 0) //修改了数组的5-7位数值
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Println("sli4:", sli4)
fmt.Println("sli5:", sli5)
fmt.Println("=========append切片(超过数组cap)==========")
sli4 = append(sli4, 99, 99, 99) //新建了一个底层数组
sli4[4] = 111 //再修改sli4不会对原数组有影响了
fmt.Println("arr:", arr)
fmt.Println("sli2:", sli2)
fmt.Println("sli3:", sli3)
fmt.Print("sli4:", sli4)
fmt.Printf("\tlen:%d,cap:%d\n", len(sli4), cap(sli4))
fmt.Println("sli5:", sli5)
}

执行结果

[]
[1 2 3 4]
[5 2 3 4]
[0 0 0]
[0 0 0 1 2]
[0 0 0 1 2 5 2 3 4]
5
2
3
4
0 5
1 2
2 3
3 4
len:3,cap:3,切片地址:0xc0000040f0,数组地址:0xc000012210
len:5,cap:6,切片地址:0xc0000040f0,数组地址:0xc00000a420
len:7,cap:12,切片地址:0xc0000040f0,数组地址:0xc00001a1e0
arr: [1 2 3 4 5 6 7 8 9 10]
sli2: [1 2 3 4 5]
len:5,cap:10,数组地址:0xc00000c1e0
sli3: [4 5 6 7 8]
len:5,cap:7,数组地址:0xc00000c1f8
sli4: [6 7 8 9 10]
len:5,cap:5,数组地址:0xc00000c208
sli5: [1 2 3 4 5 6 7 8 9 10]
len:10,cap:10,数组地址:0xc00000c1e0
=========更改数组==========
arr: [1 2 3 4 5 6 7 100 9 10]
sli2: [1 2 3 4 5]
sli3: [4 5 6 7 100]
sli4: [6 7 100 9 10]
sli5: [1 2 3 4 5 6 7 100 9 10]
=========更改切片==========
arr: [1 2 3 4 200 6 7 100 9 10]
sli2: [1 2 3 4 200]
sli3: [4 200 6 7 100]
sli4: [6 7 100 9 10]
sli5: [1 2 3 4 200 6 7 100 9 10]
=========append切片(未超过数组cap)==========
arr: [1 2 3 4 200 0 0 0 9 10]
sli2: [1 2 3 4 200 0 0 0]
sli3: [4 200 0 0 0]
sli4: [0 0 0 9 10]
sli5: [1 2 3 4 200 0 0 0 9 10]
=========append切片(超过数组cap)==========
arr: [1 2 3 4 200 0 0 0 9 10]
sli2: [1 2 3 4 200 0 0 0]
sli3: [4 200 0 0 0]
sli4:[0 0 0 9 111 99 99 99] len:8,cap:10
sli5: [1 2 3 4 200 0 0 0 9 10]

go基础——切片slice的更多相关文章

  1. python基础——切片

    python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...

  2. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

  3. 转 Golang 入门 : 切片(slice)

    https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...

  4. go 数组(array)、切片(slice)、map、结构体(struct)

    一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...

  5. golang切片slice

    切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...

  6. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  7. Go 灵活多变的切片Slice

    我们知道数组定义好之后其长度就无法再修改,但是,在实际开发过程中,有时候我们并不知道需要多大的数组,我们期望数组的长度是可变的, 在 Go 中有一种数据结构切片(Slice) 解决了这个问题,它是可变 ...

  8. 7 切片slice

    include 切片 切片的日常用法 切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或者 为引用类型. 可以直接创建或从底层数组获取生成. 使用le ...

  9. go递归函数如何传递数组切片slice

    数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...

随机推荐

  1. .net core集成使用EasyNetQ来使用rabbitmq

    之前有写到一篇介绍EasyNetQ的博文(C# .net 使用rabbitmq消息队列--EasyNetQ插件介绍),所以本文从.net core的角度去继承使用EasyNetQ,而用法类似于之前集成 ...

  2. MongoDB分片集群搭建及扩容

    ### 实验:分片集群搭建及扩容#### 实验目标及流程 * 目标:学习如何搭建一个两分片的分片集群 * 环境:3台Linux虚拟机器,4Core 8GB * 步骤: * 配置域名解析 * 准备分片目 ...

  3. 数学库Sage安装和使用

    什么是Sage? Sage是免费的.开源的数学软件,支持代数.几何.数论.密码学.数值计算和相关领域的研究和教学. 可以简单看成一个数学库 下载 国内地址 安装 Windows下安装 下载安装程序即可 ...

  4. Python + Selenium 定位非selected型下拉框的方法

    最近在尝试给自己负责的模块写UI自动化的Demo 登录及切换页面比较顺利 但是遇到下拉框的选择时,遇到了一点困难 我负责的模块页面的下拉框并非Select类型,无法使用select_by_index ...

  5. [ SQLAlchemy ] 自我引用型的多对多关系(Self-Referential Many-to-Many Relationship)理解

    参考: https://www.jianshu.com/p/2c6c76f94b88 https://madmalls.com/blog/post/followers-and-followeds/ 实 ...

  6. YBT 1633:【例 3】Sumdiv

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1633 A^B 快速幂求结果,所有约数和,可以通过组合来进行得到. 技巧,通过递归得到1~n次的和.su ...

  7. Cache一致性协议与伪共享问题

    Cache一致性协议 在说伪共享问题之前,有必要聊一聊什么是Cache一致性协议 局部性原理 时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问 比如循环.方法的反复调用等 空间局 ...

  8. UVA 10815 Andy's First Dictionary (C++ STL map && set )

    原题链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  9. Numpy实现简单BP神经网络识别手写数字

    本文将用Numpy实现简单BP神经网络完成对手写数字图片的识别,数据集为42000张带标签的28x28像素手写数字图像.在计算机完成对手写数字图片的识别过程中,代表图片的28x28=764个像素的特征 ...

  10. 【SpringCloud技术专题】「Gateway网关系列」(3)微服务网关服务的Gateway全流程开发实践指南(2.2.X)

    开发指南须知 本次实践主要在版本:2.2.0.BUILD-SNAPSHOT上进行构建,这个项目提供了构建在Spring生态系统之上API网关. Spring Cloud Gateway的介绍 Spri ...