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

按照以往开一些专题的风格,第一篇一般都是“从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

  注意: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使用体验差异

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

原文地址:https://www.cnblogs.com/bigdataZJ/p/array-slice-map.html

时间: 2025-01-10 00:57:54

Go语言入门——数组、切片和映射的相关文章

go语言-golang基础-数据类型数组,数组切片,映射

7.7 数组 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度. 以下为一些常规的数组声明方法: [32]byte // 长度为32的数组,每个元素为一个字节 [2*N] struct { x, y int32 } // 复杂类型数组 [1000]*float64 // 指针数组 [3][5]int // 二维数组 [2][2][2]float64 // 等同于[2

go语言 类型:数组切片

初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针.数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针: 2.数组切片中的元素个数: 3.数组切片已分配的存储空间. slice不是一个值类型,而是一个引用类型,就好比指针一样,对slice取得的元素进行写操作实际是影响到了底层的数组层,slice真的只是一层薄薄的操作封装罢了.因此,slice有一个重要的用途就是作为函数的参数,就这可以避免直接传递数组而导致整个数组发生一次内存拷贝.

Go语言入门之切片的概念

切片是对数组的抽象,对切片的改变会改变原数组的值 package main import "fmt" func test6(){ arr:=[...]int{0,1,2,3,4,5,6,7,8,9,10} s1:=arr[2:6] fmt.Println(arr) fmt.Println(s1) s1[0]=200 fmt.Println(arr) fmt.Println(s1) } func main() { test6() } //结果 [0 1 2 3 4 5 6 7 8 9 1

C语言入门-数组

今天十月一日,上午看阅兵激情澎湃,但是下午还是要继续写C语言,前面的这块很简单 int number[100]; scanf("%d" , &number[i]); 一.定义数组 变量名称[元素数量] 元素数量必须是整数 数组特点 所有的元素具有相同的数据类型 一旦创建,就不能改变大小 (数组中的元素在内存中是连续以此排序的) 二.数组例子 写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束 通常用到数组都是下面的步骤: #inclu

Go数组、切片、映射的原理--简明解析

数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续内存块. 因为数组占用的内存是连续分配的,所以对数组的操作速度很快. 声明数组的方式:4种 var array1 [5]int array1 := [5]int{3,5,6,3,2} array1 := [...]int{3,4,7,8,1} //根据数组字面量中元素的个数来确定数组的长度 arra

C语言入门基础之数组——数学和编程的完美结合(图)

C语言入门基础之数组--数学和编程的完美结合(图)姐姐又来更新了,刚刚过完周末,是不是玩的很开心啊,放松后我们来学习新知识吧!现在我们要讲数组啦,编程往往和数学紧密联系着,想必在我们高中有学习过集合吧.那么在编程中我们怎么表示集合呢?刚学编程的小可爱可能学到变量时候发现,如果我需要用很多变量存储同意作用的值,需要大量的变量.现在让小姐姐给你介绍下二维数组吧,小可爱可要认真学了哦!记得给小姐姐点赞,?( ′???` )比心大家都玩抖音吧,我们每个人都有一个抖音号,我们还会关注一些小姐姐的抖音号,那

Go语言中的数组与数组切片

Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [index]类型{也可不加} 1.元素访问:1.跟C语言一样通过数组来访问 2.通过关键字range来访问 如:for i,v :=range array{ fmt.Printlb(*Array element[",i,"]=*,v) }第一个表示下标从0到len(array)-1 2.值类型

go语言的数组与切片

go语言的数组与切片 如果有编程基础的话,提到数组我们肯定不会陌生,所谓数组,就是有数的元素序列,我们可以认为数组是有限的相同类型数据的集合. 数组长度是固定的,所以这会带来很多局限性. 比如说只接受相同类型的元素,长度固定等等. 那么切片的出现,则为golang解决了以上数组所带来的不便. 切片(slice)是一个引用类型,它是拥有相同类型的元素并且长度可变的序列. 基于数组类型做的一层封装,支持扩容. 切片的内部结构包含地址.长度.容量.它主要用于服务一块数据的集合. 下面我们来看一看数组的

C 语言入门---第六章 C语言数组

数组就是一些列具有相同类型的数据的集合,这些数据在内存中一次挨着存放,彼此之间没有缝隙. 我们可以将二维数组看作一个Excel表格,有行有列,length1 表示行数,length2 表示列数,要在二维数组中定位某个元素,必须同时指明行和列. 二维数组在概念上是二维的,但在内存中是连续存放的,换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙.在线性内存中存放二维数组有两种方式: 1. 按行排列,放完一行之后再放入第二行 2. 按列排列,放完一列之后再放入第二列. ===========