45

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

 4 years ago
source link: https://www.tuicool.com/articles/v2A3myf
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了。

1、简介

Go是什么?

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

Github地址

https://github.com/golang/go

官网地址

https://golang.org

中文网社区

https://studygolang.com

如果需要下载安装包,可以进入 https://studygolang.com/dl 下载,速度较快

https://www.golangtc.com/

关键字

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

2、环境搭建

下载安装

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

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

环境变量配置

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

numEBb2.png!web

0518-1-配置环境变量.png

jIFZj27.png!web

0518-2-配置环境变量2.png

注意: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的语言可能有点懵~

3、背景知识

类型后置

不同于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,所以重复申明也会编译出错

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

4、数组

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

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

  • 方式1
var arr [5]int // 注意这里必须要声明大小,下面要讲的切片这里可以不用声明大小
arr[0] = 0
arr[1] = 1
arr[4] = 4
  • 方式2
var arr []int
arr = make([]int, 4)

该方式通过make指定数组的大小,这里表示数组容量为4,超过4,比如赋值如 arr[4]=4 ,则会报错 panic: runtime error: index out of range

panic相当于Java里面的Exception

  • 方式3
var arr [5]int{1,2,3,4,5}
  • 方式4
arr := [5]int{1,2,3,4,5}
  • 方式5
var arr [...]int{0:1, 3:4, 1:2} // x:y,其中x表示index,y表示值,...表示变长和Java中的变长函数一个道理

5、切片

切片有些语言里面可能没有这个名词,我记得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表示结束为止,是一个左闭右开区间

6、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}

7、共同点和差异点

  • 数组、切片和Map都可以通过make关键字进行初始化

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

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

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

8、下篇预告

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

2、Go和Java使用体验差异


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK