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. docker部署logstash

    1.下载镜像 [root@vanje-dev01 ~]# docker pull logstash:7.0.1 2.安装部署 2.1  创建宿主映射目录 # mkdir /etc/logstash/ ...

  2. maven pom.xml 的 spring-boot-maven-plugin 红色报错 解决

    解决方法,添加对应的spring boot 版本号即可

  3. 日志收集系统系列(三)之LogAgent

    一.什么是LogAhent 类似于在linux下通过tail的方法读日志文件,将读取的内容发给kafka,这里的tailf是可以动态变化的,当配置文件发生变化时,可以通知我们程序自动增加需要增加的配置 ...

  4. 日志通过脚本导入到HDFS当中

    可以关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 利用shell脚本定时备份日志数据到HDFS上(适合日志数据比较少的时候) 时间命令 d ...

  5. CentOS6.9部署Redis3.2.9+FastDFS_4.06+Nginx1.5.0

    CentOS6.9部署Redis3.2.9+FastDFS_4.06+Nginx1.5.0 原文链接:https://www.toutiao.com/i6481931577499582990/ 一.上 ...

  6. nuxt中iview按需加载配置

    在plugins/iview.js中修改 初始代码如下 import Vue from 'vue' import iView from 'iview' import locale from 'ivie ...

  7. 学习笔记--我的第一个Java程序

    我的第一个Java程序 // pubilc 表示公开的 // class 表示定义一个类 // HelloWorld 表示一个类名 public class HelloWorld { // 表示定义一 ...

  8. 【Java常用类】两个Date类

    两个Date类 java.util.Date类 两个构造器的使用 构造器一:Date():创建一个对应当前时间的Date对象 构造器二:创建指定毫秒数的Date对象 两个方法的使用 toString( ...

  9. 听不懂x86,arm?

    之前听别人讲x86或者ARM,我心里有一些疑惑,为什么他们不考虑32位还是64位的? 直到和师傅交流了一下: I:32位机是不是不支持部署k3os? T:这个年头哪里还有32位机? T:现在说x86, ...

  10. JAVA实现对阿里云DNS的解析管理

    1.阿里云DNS的SDK依赖 <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-op ...