Go语言入门——数组、切片和映射

Go语言入门——数组、切片和Map

按照以往开一些专题的风格,第一篇通常都是“从HelloWorld开始”git

可是对于Go,思来想去,感受真的从“HelloWorld”提及,压根撑不住一篇的篇幅,由于Go的HelloWorld太简单了。github

一、简介

Go是什么?golang

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具备垃圾回收功能的编程语言。——摘自百度百科编程

Github地址数组

github.com/golang/gobash

官网地址数据结构

golang.org并发

中文网社区app

studygolang.com编程语言

若是须要下载安装包,能够进入studygolang.com/dl下载,速度较快

www.golangtc.com/

关键字

简单,学习曲线低,自然高并发,背景雄厚,大厂拥抱

二、环境搭建

下载安装

进入官网或者studygolang.com/dl下载对应系统的安装包(个人是MacOS系统)

下载成功后点击安装(无脑下一步便可)

环境变量配置

打开命令行执行sudo vi ~/.bash_profile配置GOROOT和GOPATH

注意:GOPATH若是不配置,默认在会在用户目录下新建go目录,GOPATH至关于工做空间,有点相似Java开发的workspace。

配置完成执行go version出现相似

go version go1.12.4 darwin/amd64
复制代码

则表示安装成功

开发工具

至于开发工具看我的喜爱,鉴于作Java开发使用的宇宙第一好用IDE intellij idea确实好用,因此我的仍是继续用JetBrain的产品Goland做为开发IDE。

固然,除此之外,还有Atom,VS code等等。

下面开始进入正题,说说Go语言中的数组、切片和映射即Map。在此以前还须要介绍几个背景知识,否则第一次看Go的语言可能有点懵~

三、背景知识

类型后置

不一样于Java、C++等不少语言,Go采用类型后置的方式声明变量

好比Java中声明一个int的基本类型是这样的

int a = 3;
复制代码

而Go里面其中一种声明方式是这样的

var a int
a = 3
复制代码

多样的赋值语句

Go的声明和初始化方式丰富多样,有点太丰富了,据说2.0版本要稍微收收规范下

好比以下的方式是正确的

  • 方式1
var a int
a = 3
复制代码

**解读:**初始化语句代表了a是一个int类型

而后才能对一个int类型进行赋值

  • 方式2
var a = 3
复制代码

**解读:**虽然没有明确表示这是一个int,可是Go能够根据后面的赋值推断出a的类型

  • 方式3
a := 3
复制代码

**解读:**这是一种简单高效的初始化和赋值方式,:=表示初始化一个变量a并同时对其赋值为3

如下方式是不正确的

  • 方式1
var a
复制代码

**解读:**基于这样的信息,a没有赋值,Go编译器是没法知道a的类型,也没法对其进行初始化和赋值了

  • 方式2
var a int
a := 3
复制代码

**解读:**虽然正确的声明了一个int类型的a变量,可是下面的:=至关有从新声明了一个变量a,因此重复申明也会编译出错

有了上面两个背景知识储备,加上自个儿在相关语言上面深厚的积累,开始下面的讲解就没事问题了~

四、数组

数组几乎是每一个语言必备的数据结构之一,Go也不例外。

数组也有多种初始化和赋值方式

  • 方式1
var arr [5]int // 注意这里必需要声明大小,下面要讲的切片这里能够不用声明大小
arr[0] = 0
arr[1] = 1
arr[4] = 4
复制代码
  • 方式2
var arr [5]int{1,2,3,4,5}
复制代码
  • 方式3
arr := [5]int{1,2,3,4,5}
复制代码
  • 方式4
var arr [...]int{0:1, 3:4, 1:2} // x:y,其中x表示index,y表示值,...表示变长和Java中的变长函数一个道理
复制代码

五、切片

切片有些语言里面可能没有这个名词,我记得Python里面有,Java里就没有。

切片能够当作是一种特殊的数组,该种数组能够变长。其生命和初始化方式也有多种

  • 方式1
var s []int{1,2,3,4,5}
s := []int{1,2,3,4,5}
复制代码
  • 方式2
s := make([]int, 3, 5) // 3所在位置表示切片长度,5所在位置表示容量即最大可能存储的元素个数
复制代码

注意:s[2]=2该赋值是合法的,可是s[3]=3则会报错,由于须要使用append追加元素,相似

s = append(s, 3) // 此时len=4, cap=5
s[3] = 10	// 对s[3]从新赋值,合法
复制代码

另外若是赋值时,切片长度没超过定义的切片的长度,返回原来的切片地址,若是超过了长度,切片会扩容进行从新分配地址。

  • 方式3
s := arr[1:3]	// 表示截取数组一部分红为一个切片,1表示起始位置,3表示结束为止,是一个左闭右开区间
复制代码

六、Map

map就是键值对,跟Java的没差

声明好初始化的方式以下

  • 方式1
var m map[string]int	// string所在位置表示key的类型,int所在位置表示value的类型
复制代码
  • 方式2
m := make(map[string]int, 5)	// 5所在位置表示map的容量
复制代码
  • 方式3
m = map[string]int{"jackie":1, "zheng":8}
复制代码

七、共同点和差别点

  • 切片和Map均可以经过make关键字进行初始化

  • 数组、切片和Map都支持在{}里面使用index:value进行初始化值

  • 数组和切片差异在于数组必须声明数组容量,即便是变长声明类型,也必须列出具体数组元素

  • 切片有append函数,涉及到扩容等问题

八、下篇预告

一、数组、切片和map的遍历以,切片扩容,map根据key和value排序等

二、Go和Java使用体验差别

我的公众号:JackieZheng 我会将我最新的文章推送给您,并和您一块儿分享我平常阅读过的优质文章

相关文章
相关标签/搜索