目录

数组

Go的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性。和其它语言相比差异主要在声明和初始化的写法上,下面是简单声明一个数组:

var a [5]int
fmt.Println(a[0])
fmt.Println(fmt.Println(a[len(a)-1]))

上面的a是一个长度为5的整数数组,如果没有给定初始值它里面的元素默认值是0Go数组的下标是从0开始的,len函数返回数组中元素的个数。我们可以在声明数组的时候初始化它的值:

var m [3]int = [3]int{1, 2, 3}
var n [3]int = [3]int{2, 3}

这里的mn都是长度为3的数组,m对应的值是1, 2, 3而由于n初始化的时候只有2个值,因此它里面的值是2, 3, 0

如果采用简单声明:=的方式声明一个数组,可以指定数组的大小,也可以不指定大小这时它会根据初始化值的个数来确定:

a := [10]int{} //元素都为0
b := [...]int{1, 2} //长度为2

Go 也可以直接指定一个索引和值,来初始化,如果声明的时候长度不指定,那最大的索引加1就是数组的长度:

a := [10]int{1:2} // 长度10,a[1] = 2 其它为0
b := [...]int{1:2, 10:1} //长度11,a[1] = 2 a[10] = 1其它为0

数组a长度声明是10,只给了索引1的值为2,其余都为0。数组b声明的时候索引12101,它的长度是11

修改数组中某个索引的值方式和其它语言一样:

a := [10]int{}
a[0] = 10

数组的类型是由元素的类型和长度共同决定的,[3]int[4]int是两种不同的数组类型。因此:

a := [3]int{1, 2, 3}
a = [4]int{1, 2, 3, 4}

编译的时候会报错,而:

a := [3]int{1, 2, 3}
a = [3]int{4, 5, 6}

是正确的

Slice

上面说的数组长度是固定,使用的时候不是很灵活,slice的长度是可变,简单声明一个未初始化的slice

var a []int
print(len(a))
print(cap(a))

slice也可以利用len返回它的长度,刚才声明的slice长度为0。除了长度slice还有一个容量cap的概念,用cap可以返回它的容量。长度不能超过它的容量。slice的声明也可以用make,用make声明可以指定容量和可以不指定容量,这时容量和长度一致:

a := make([]int, 10) //长度为10,容量为10
a := make([]int, 10, 12) //长度为10 容量为12

slice可以进行切片操作slice[i:j],创建一个新的slice,新的slice范围是原来slice下标ij-1,也可以不指定下标slice[:j]则是默认从0j-1,同理如果slice[i:]就是从i到最后一个元素,下面是一个简单的例子:

a := []int {1, 2, 3, 4, 5}
b = a[1:2]
c = a[:2]
d = a[1:]

需要注意的是切片操作slice[i:j]j可以大于slice的长度,只要它小于容量

刚才一直讲到容量,那它到底有什么实际意义呢?开始slice的时候说过它长度是可变的,哪怎么改变了?通过append就可以对slice追加元素,这时容量就有作用了,如果append的时候当前长度小于容量,那slice不会扩大容量,也不会申请新的空间,而是在原来的基础上把长度加1就行了,如果容量等于长度,则会扩容,扩容会申请新的空间。

package main

func main() {
a := make([]int, 10, 11)
a = append(a, 1)
println(len(a), cap(a)) // 11 11 a = append(a, 1)
println(len(a), cap(a)) // 12 12
}

Go的100天之旅-06数组和Slice的更多相关文章

  1. 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」

    假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 ...

  2. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  3. javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

    主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...

  4. Jsの练习-数组常用方法 -slice()

    slice() 返回从原数组指定开始下标到结束下标之间的项组成的新数组. slice()方法可以接收一个或两个参数,即要返回项的起始和结束位置. 在只有一个参数的情况下,slice()方法返回从该参数 ...

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

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

  6. slice splice(数组) 和 slice substr substring split (字符串)的区别

    array.slice(start,end)slice()如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾如果两个参数中的任何一个是负数,array.length会和它们相加 stri ...

  7. go基础之基本数据结构(数组、slice、map)

    go基本的数据结构有数组.slice.map,高级数据结构为结构体为用户自定义类型.本片文章主要讲解三大基本数据结构. 数组 slice Map 数组 数组是包含单个类型的元素序列,但是长度固定的数据 ...

  8. 我的Vue之旅 06 超详细、仿 itch.io 主页设计(Mobile)

    第二期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 仿 itch.io 平台主页. 我的主题 HapiGames 是仿 itch.io 的 in ...

  9. Java知识系统回顾整理01基础06数组03排序

    一.选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个 ...

随机推荐

  1. laravel向视图传递变量

    向视图中传递变量 我们在开发web应用当中,通常都不是为了写静态页面而生的,我们需要跟数据打交道,那么这个时候,问题就来了,在一个MVC的框架中,怎么将数据传给视图呢?比如我们要在 ArticleCo ...

  2. rust 函数-生命周期

    记录一下自己理解的生命周期. 每个变量都有自己的生命周期. 在c++里生命周期好比作用域, 小的作用域的可以使用大作用域的变量. 如果把这里的每个作用域取个名,那么就相当于rust里的生命周期注解. ...

  3. Jmeter 测试接口

    创建线程组 添加HTTP请求 查看结果树

  4. .Net Core 中GC的工作原理

    前言 .NET 中GC管理你服务的内存分配和释放,GC是运行公共语言运行时(CLR Common Language Runtime)中,GC可以帮助开发人员有效的分配内存和和释放内存,大多数情况下是不 ...

  5. 面试题64:求 1 + 2 + ... + n

    这道题目条件限制严格,需要发散思维...但是作者是以 C++ 语言特性来做讲解的,对于 Java 狗只能说稍微有点参考意义吧!

  6. IntelliJ IDEA 2018.3.6 安装、激活 JRebel

    在 IntelliJ IDEA 2018.3.6 中安装## JRebel 1.代开 IDEA 开发工具,然后用快捷键 Ctrl+Alt+S 打开设置并搜索 jrebel 插件 2.安装 jrebel ...

  7. 关于 urlencode 的使用和 json 模块的介绍

    先附上一段 “百度翻译” 的爬虫代码 # python爬虫实现百度翻译 # urllib和request POST参数提交 from urllib import request,parse impor ...

  8. python之浅谈循环

    目录 流程控制之while循环 语法 while+break while+continue while+else while循环的嵌套 流程控制之for循环 语法 for+break for+cont ...

  9. linux系统,没有安装任何编辑器的情况,如何操作文件

    [清空文件] echo  " " > filename [添加内容] echo "123" >> filename

  10. Oracle Solaris 10图文安装

    文章目录 1. 虚拟机软件 2. solaris 10镜像 3. 安装OS 4. 允许远程使用root用户登录SSH 5. bash配置 5.1. 修改bash 5.2. 修改提示符 6. CRT连接 ...