package main

/*
切片Slice
其本身并不是数组,它指向底层的数组
作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型
可以直接创建或从底层数组获取生成
使用len()获取元素个数,cap()获取容量
一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部
make([]T, len, cap)
其中cap可以省略,则和len的值相同
len表示存数的元素个数,cap表示容量 用new创建数组的时候是一个指向数组的指针。
*/ import (
"fmt"
) func main() {
var slice1 []int //中括号里面是数字或者3个点就表示数组,
//中括号里面既不是数字也不是3个点就表示是slice不是数组
fmt.Println(slice1) //[],slice的底层也是数组保存的,打印也是数组的格式, a := []int{, , , , , , , , }
fmt.Println(a) //[1 2 3 4 5 6 7 8 9 0] s1 := a[] //一个slice
fmt.Println(s1) // s2 := a[:] //数组的索引从5到9,包头不包尾,//一个slice
fmt.Println(s2) //[6 7 8 9 0] s3 := a[:len(a)] //数组的索引从5到长度减一,包头不包尾,//一个slice
fmt.Println(s3) //[6 7 8 9 0] s4 := a[:] //数组的索引从5到尾部,//一个slice
fmt.Println(s4) //[6 7 8 9 0] s5 := a[:] //数组的索引从开头到索引为4,//一个slice
fmt.Println(s5) //[1 2 3 4 5] s11 := make([]int, ) //初始化3个元素,并放在slice所指向的数组中,
fmt.Println(s11) // [0 0 0] s22 := make([]int, , ) //初始化3个元素,slice指向的是一个数组,数组是一块连续的内存,
//数组不能动态修改长度, 10第三个参数是数组的容量,现在是3个,但是总共可以有10个,当超出10个后
//会重新分配连续的内存块(内存地址改变了)(重新分配内存的效率低),并且容量扩大一倍成20,
fmt.Println(s22) // [0 0 0]
fmt.Println(len(s22), cap(s22)) // 3,10 //slice是引用类型的并且可以扩容的数组 a1 := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}
s33 := a1[:] //一个slice
fmt.Println(s33) // [99 100 101]
fmt.Println(string(s33)) // cde /*
Reslice
Reslice时索引以被slice的切片为准
索引不可以超过被slice的切片的容量cap()值
索引越界不会导致底层数组的重新分配而是引发错误
*/
//从slice中获取slice
s44 := s33[:] //一个slice
fmt.Println(s44) //[100 101]
fmt.Println(string(s44)) //de /*
Append
可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终长度未超过追加到slice的容量则返回原始slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
*/ s55 := make([]int, , ) //3个元素容量为6的slice
fmt.Printf("%v,%p\n", s55, s55) //[0 0 0],0xc04200e2a0
s55 = append(s55, , , )
fmt.Printf("%v,%p\n", s55, s55) //[0 0 0 1 2 3],0xc04200e2a0,没有超过容量不重新分配内存地址
s55 = append(s55, , , )
fmt.Printf("%v,%p\n", s55, s55) //[0 0 0 1 2 3 1 2 3],0xc04203a120,超过容量重新分配内存地址 a2 := [...]int{, , , , }
s66 := a2[:] //[3 4 5],不显示的加容量,则容量就是此时slice中元素的个数3,
s77 := a2[:] // [2 3]
fmt.Println(s66, s77)
s66[] =
fmt.Println(s66, s77) //[9 4 5] [2 9],slice指向一个底层的数组,其中一个改变另外一个也改变,
//如果超过slice的容量会重新分配内存,此时改变这个slice其他的slice就不会改变了
s66 = append(s66, , , , , , , , , , )
s66[] =
fmt.Println(s66, s77) //[99 4 5 1 2 3 2 3 2 3 4 3 4] [2 9] //slice的copy函数
s88 := []int{, , , , , }
s99 := []int{, , }
copy(s88, s99) //左边是拷贝到的元素,后面是被拷贝的元素,吧前三个元素拷贝到s88的前三个
fmt.Println(s88, s99) //[7 8 9 4 5 6] [7 8 9] ss11 := []int{, , , , , }
ss22 := []int{, , }
copy(ss22, ss11)
fmt.Println(ss11, ss22) //[1 2 3 4 5 6] [1 2 3],ss22只有3个元素,则只接收3个元素逇拷贝 ss33 := []int{, , , , , }
ss44 := []int{, , }
copy(ss33, ss44[:]) //部分拷贝
copy(ss33[:], ss44[:]) //指定拷贝到哪里
fmt.Println(ss33, ss44) //[1 2 3 4 5 6] [1 2 3],ss22只有3个元素,则只接收3个元素逇拷贝 }

go6---slice切片的更多相关文章

  1. golang:slice切片

    一直对slice切片这个概念理解的不是太透彻,之前学习python的就没搞清楚,不过平时就用python写个工具啥的,也没把这个当回事去花时间解决. 最近使用go开发又遇到这个问题,于是打算彻底把这个 ...

  2. golang slice切片的原理以及内置函数cap, len

    golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...

  3. python定制类(1):__getitem__和slice切片

    python定制类(1):__getitem__和slice切片 1.__getitem__的简单用法: 当一个类中定义了__getitem__方法,那么它的实例对象便拥有了通过下标来索引的能力. c ...

  4. golang基础---Slice切片

    切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...

  5. Go语言核心之美 3.2-slice切片

    Slice(切片)是长度可变的元素序列(与之相应,上一节中的数组是不可变的),每一个元素都有同样的类型.slice类型写作[]T.T是元素类型.slice和数组写法非常像,差别在于slice没有指定长 ...

  6. Go - Slice 切片

    概述 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除. len() 和 cap() 返回结果可相同和不同. 声明切片 //demo_7.go package main impo ...

  7. Go(03) slice切片的使用

    原文链接 http://www.limerence2017.com/2019/05/08/golang05/#more golang 的引用类型和内置类型变量 golang 中变量类型分为引用类型和值 ...

  8. 3.9 Go Slice切片

    3.9 Go Slice切片 Go语言切片(Slice) 切片是可动态变化的序列,是对数组的引用,引用类型,遵循引用传递的机制 slice类型写作[ ]T,T是slice元素类型,var s1 []i ...

  9. [日常] Go语言圣经-Slice切片习题

    1.Slice(切片)代表变长的序列,序列中每个元素都有相同的类型,一个slice类型一般写作[]T,其中T代表slice中元素的类型:slice的语法和数组很像,只是没有固定长度而已,slice的底 ...

  10. golang 数组以及slice切片

    老虞学GoLang笔记-数组和切片   数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其 ...

随机推荐

  1. 杀了个回马枪,还是说说position:sticky吧

    <style> article { max-width: 600px; margin: 1em auto; } article h4, article footer { position: ...

  2. cc.AudioSource

    cc.AudioSource1:AudioSource组件是音频源组件, 发出声音的源头2: AudioSource组件面板: clip: 声源的播放的音频对象: AudioClip, mp3, wa ...

  3. [Python3网络爬虫开发实战] 3.1-使用urllib

    在Python 2中,有urllib和urllib2两个库来实现请求的发送.而在Python 3中,已经不存在urllib2这个库了,统一为urllib,其官方文档链接为:https://docs.p ...

  4. [Python3网络爬虫开发实战] 1.5.4-RedisDump的安装

    RedisDump是一个用于Redis数据导入/导出的工具,是基于Ruby实现的,所以要安装RedisDump,需要先安装Ruby. 1. 相关链接 GitHub:https://github.com ...

  5. Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner

    Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...

  6. CodeForces 159E

    题目大意: 给定一堆带颜色和高度的魔方 用两种颜色的魔方,一种颜色接一种颜色向上拼接搭建成一个高塔,求高塔的最长高度,以及将拼接的过程中对应的编号顺序输出 多种情况成立输出任意一种即可 这里首先要对颜 ...

  7. noip模拟赛 Nephren Ruq Insania

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 注意:本题大样例4的输出文件修改为 https://pan.baidu.com/s/1b ...

  8. zoj4710暴力

    #include<stdio.h> #include<string.h> #define N 110 int map[N][N]; int main() { int n,m,k ...

  9. 洛谷——P1458 顺序的分数 Ordered Fractions

    P1458 顺序的分数 Ordered Fractions 题目描述 输入一个自然数N,对于一个最简分数a/b(分子和分母互质的分数),满足1<=b<=N,0<=a/b<=1, ...

  10. Linux系统备份还原工具1(DD)(应用实例)

    DD使用教程:http://www.cnblogs.com/EasonJim/p/7442223.html 以下实例没经过大量测试,可能在一些机器上不会有效. 一般围绕以下几点进行设置: 1.dd完后 ...