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. centos6.5-svn搭建文档

    下载相关软件 wget http://subversion.tigris.org/downloads/subversion-1.6.6.tar.gz wget http://subversion.ti ...

  2. nginx高并发配置详解

    https://www.cnblogs.com/liqiu/p/3152206.html 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 ...

  3. 简单的Dos 命令

    1.1.如何操作DOS命令 开始---运行---输入cmd--回车 或者 Win + R ---运行---输入cmd--回车 1.2.基本命令 1. 命令:color f0 帮助:color ? 作用 ...

  4. x86架构应用如何向Arm架构低成本迁移

    曾几何时,无论是在服务器还是个人电脑,CPU芯片领域一直是 Intel 独占鳌头,旗下的 X86_64 架构被广泛采用.然而王权没有永恒,近年来 Arm64 架构异军突起,服务器端有华为鲲鹏920高性 ...

  5. No shutdown animation in the electricity display only 1%

    低电量自动关机时无关机动画 低电量自动关机时无关机动画1. 问题描述2. 分析3. solution4. 总结 1. 问题描述 DEFECT DESCRIPTION: No shutdown anim ...

  6. Android官方文档翻译 六 1.4Starting Another Activity

    Starting Another Activity 开启另一个Activity This lesson teaches you to 这节课教给你: Respond to the Send Butto ...

  7. day5 数组对角线及最大值

    1.输出M行M列数组方针,求对角线元素和#define M 5void fun(int xx[][M], int n)//n行n列{ int i = 0; int sum = 0; for (i = ...

  8. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  9. HttpRunner3的用例是怎么运行起来的

    在PyCharm中打开examples/httpbin/basic_test.py: 首先映入眼帘的是左上角那个绿色小箭头,点了一下,可以直接运行,意味着HttpRunner是能够直接被pytest驱 ...

  10. Windows蓝牙失效超全攻略

    新电脑蓝牙出现问题,我捣鼓了很久,历经九九八十一难得以修复,说一说我在网上看到的各种方法. 一个功能正常使用,需要经过一个又一个的步骤.任何一个地方出问题,都有可能造成蓝牙失效.以下方法按出现概率从大 ...