3.2 Slice

  一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。
  一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素
并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
内置的len和cap函数分别返回slice的长度和容量。多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。

3.2.1 创建Slice

1、make
使用make时,需要传入一个参数,指定切片的长度。

slice := make([]string, 5)    //创建一个字符串切片,长度和容量都是5个元素
slice := make([]string, 3, 5) //创建一个字符串切片,长度为3,容量为5

2、切片字面量来声明切片

slice := []int{10, 20, 30}  //创建一个整型切片,长度和容量都是3个元素
slice := []string{99: “”} //创建字符串切片,使用空字符串初始化第100个元素

3、nil切片
nil在底层数组包含0个元素,也没有分配任何存储空间,长度为0,容量为0。

var slice []int //创建nil整形切片
slice := make([]int, 0) //使用make创建空的整型切片
slice := []int{} //使用切面字面量创建空的整形切片

3.2.2 使用切片

1、赋值和切片

//创建一个整形切片
slice := []int{10, 20, 30, 40, 50}
//创建一个新切片,长度为2,容量为4(从索引1开始,之前的元素对它而言不存在)
newSlice := slice[1:3]

  对底层数组容量是k的切片slice[i:j]来说:
  长度: j – i

   容量: k – I
2、使用append向切片增加元素
  请看下面代码:

package main

import "fmt"

func main() {
//创建一个整形切片
slice := []int{10, 20, 30, 40, 50}
fmt.Println("slice is:", slice) //创建一个新切片,长度为2,容量为4
newSlice := slice[1:3]
fmt.Println("newSlice is:",newSlice) //对newSlice追加新元素,长度为3,容量为4
newSlice = append(newSlice, 60)
fmt.Println("newSlice append is:", newSlice) fmt.Println("now slice is:", slice)
}

运行结果:
  slice is: [10 20 30 40 50]
  newSlice is: [20 30]
  newSlice append is: [20 30 60]
  now slice is: [10 20 30 60 50]

  slice和newSlice共享同一段底层数组,newSlice是从索引1的位置开始,因此对newSlice进行append时,其实是修改slice的第四个数值,从打印结果我们也可以得出这样的结论。
  slice和newSlice共享同一段底层数组,但通过不同的切片会看到底层数组的不同部分。如果一个切片修改了该底层数组的共享部分,另一个切片也能感知到。

Go数据类型之复合数据类型--Slice的更多相关文章

  1. Go数据类型之复合数据类型--数组

    3.1数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.数组中每个元素类型相同,又是连续分配,因此可以以固定的速度索引数组中的任何数据,速度非常快. 3.1.1声明 ...

  2. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  3. Go语言入门篇-复合数据类型

    复合数据类型 主要讨论四种类型——数组.slice.map和结构体 数组和结构体聚合类型   --数组和结构体都是有固定内存大小的数据结构 --数组:由同构的元素组成——每个数组元素都是完全相同的类型 ...

  4. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  5. 【Oracle】Oracle中复合数据类型

    1,常见的操作数据库的技术有那些 jdbc     使用java 访问数据库的技术    PLSQL  (procedure  过程化sql) 在数据库内部操作数据的技术    proc/c++    ...

  6. hive的复合数据类型

    hive中的复合数据类型 Array array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b' 数据结构如下: zhangsan beijing, ...

  7. C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)

    C/C++复合数据类型 壹(数组.结构) 数组 数组的意义.定义与创建 一.二维数组应用 字符数组与字符串处理函数 数组与指针---关系密切 数组的意义与定义创建 意义:反映数据间的特点(通过把同一类 ...

  8. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  9. Chisel3 - 复合数据类型

    https://mp.weixin.qq.com/s/rXYqiZKuBpAYL8R94zxgRA   Chisel允许用户根据需要,把基本数据类型组合成为复合数据类型使用.如C语言里面的结构体,这样 ...

随机推荐

  1. ubuntu18 maven

    user1@user1-ThinkPad-W540:~$ user1@user1-ThinkPad-W540:~$ sudo mkdir /opt/maven[sudo] password for u ...

  2. 二进制和ASCII文件的区别

    二进制和ASCII文件的区别 觉得有用的话,欢迎一起讨论相互学习~Follow Me 版权声明:本文为CSDN博主「迂者-贺利坚」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出 ...

  3. flex布局大全

    有句话叫做:存在即是合理. 最近很喜欢flex布局模式,不过还在摸索中,这里正一边在项目中使用和总结,也在学习一些大牛们总结的东西和布局思考. 鉴于自己很苦恼,到处去ha资料,真的,就没有一个系统的, ...

  4. 使用transform后z-index失效的解决方法

    transform作用的元素增加translateZ,父级元素增加 transform-style: preserve-3d; <div class="father"> ...

  5. 使用consul实现分布式服务注册和发现--redis篇

    安装consul client consul 客户端检脚本 ====================================================================== ...

  6. centos7 intall nvidia driver

    此教程是介绍于 CentOS 7 以上的 Linux 系统中安装 NVIDIA 显卡驱动和 CUDA Toolkit .此文中以 CentOS 7.4 64 bit 为例,显卡型号为 NVIDIA T ...

  7. sourcetree在mac上的使用

    sourcetree是git在Mac上管理代码的ui工具,当然你也可以使用命令直接使用git来管理代码,sourcetree下载下载地址:https://www.sourcetreeapp.com. ...

  8. PHP设计模式 - 桥接模式

    将抽象部分与它的实现部分分离,使他们都可以独立的变抽象与它的实现分离,即抽象类和它的派生类用来实现自己的对象 桥接与适配器模式的关系(适配器模式上面已讲解): 桥接属于聚合关系,两者关联 但不继承 适 ...

  9. LeetCode 788. 旋转数字(Rotated Digits) 36

    788. 旋转数字 788. Rotated Digits 题目描述 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数.要求每位数字 ...

  10. Golang_互斥锁

    为什么需要锁? 在并发的情况下,多个线程或协程同时去修改一个变量.使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量. 锁的概念就是,我正在处理 a(锁定),你们等着,等我处理完了(解锁),你 ...