Go语言入门——数组、切片和映射
按照以往开一些专题的风格,第一篇一般都是“从HelloWorld开始”
但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了。
1、简介
- Go是什么?
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。——摘自百度百科
- Github地址
- 官网地址
- 中文网社区
如果需要下载安装包,可以进入https://studygolang.com/dl下载,速度较快
- 关键字
简单,学习曲线低,天然高并发,背景雄厚,大厂拥抱
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的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。
Go语言入门——数组、切片和映射的更多相关文章
- Go语言入门——数组、切片和映射(下)
上篇主要介绍了Go语言里面常见的复合数据类型的声明和初始化. 这篇主要针对数组.切片和映射这些复合数据类型从其他几个方面介绍比较下. 1.遍历 不管是数组.切片还是映射结构,都是一种集合类型,要从这些 ...
- go语言学习-数组-切片-map
数组 go语言中数组的特点: 数组的长度是固定的,并且长度也是数组类型的一部分 是值类型,在赋值或者作为参数传递时,会复制整个数组,而不是指针 定义数组的语法: var arr1 = [5]int{1 ...
- go语言 类型:数组切片
初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针.数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数组的指针: 2.数组切片中的元素个数: 3.数组切 ...
- Numpy入门 - 数组切片操作
本节主要演示数组的切片操作,数组的切片操作有两种形式:更改原数组的切片操作和不更改原数组的切片操作. 一.更改原数组的切片操作 import numpy as np arr = np.array([1 ...
- (三)Lua脚本语言入门(数组)
又要找工作了,变的忧虑了,唯有学习才让内心变得踏实,今天玩了一下午的王者荣耀,正事都忘了...... 如果认为所谓的毅力是每分每秒的“艰苦忍耐”式的奋斗,那这是一种很不足的心理状态.毅力是一种习惯,毅 ...
- Go语言入门之切片的概念
切片是对数组的抽象,对切片的改变会改变原数组的值 package main import "fmt" func test6(){ arr:=[...],,,,,,,,,,} s1: ...
- C语言入门-数组
今天十月一日,上午看阅兵激情澎湃,但是下午还是要继续写C语言,前面的这块很简单 int number[100]; scanf("%d" , &number[i]); 一.定 ...
- (四)Lua脚本语言入门(数组遍历)
这篇文章就当成铺垫型的文章,写着写着发现有好多想写的,,关于C#与Java,当然作为铺垫肯定与Lua的下部分介绍有关..... 对于"泛型",先看C#中"泛型" ...
- 第四章 go语言 数组、切片和映射
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 数组是由同构的元素组成.结构体是由异构的元素组成.数据和结构体都是有固定内存大小的数 ...
随机推荐
- json字符串转集合或者数组
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...
- 网络新闻传输协议NNTP
一.Usenet与新闻组 Usenet新闻系统是一个全球存档的“电子公告板”,各种主题的新闻组一应俱全.新闻组可以是面向全球泛泛而谈,也可以是只面向某一个地区区域. 整个系统是由一个大量计算机组成的一 ...
- JavaScript:学习笔记(4)——This关键字
JavaScript:学习笔记(4)——This关键字 以前这篇帖子是关于闭包的,但是我想弄明白的其实是This关键字.JavaScript的this和Java等面向对象语言中的this大不一样,bi ...
- File.basename
File.basename函数 返回filename中的最后一条斜线后面的部分.若给出了参数suffix且它和filename的尾部一致时,该方法会将其删除并返回结果. 例: p File.basen ...
- JS 中的面向对象
创建对象的集中常见方式 1 . 使用 Object 或 对象字面量创建对象 2 . 工厂模式创建对象 3 . 构造函数模式创建对象 4 . 原型模式创建对象 1 . 使用 Object 或 对象字面量 ...
- 多线程(一) NSThread
OS中多线程的实现方案: 技术 语言 线程生命周期 使用频率 pthread C 程序员自行管理 几乎不用 NSthread OC 程序员自行管理 偶尔使用 GCD C 自动管理 经常使用 NSOpe ...
- Mac安装 Storm 小结
Strom 安装&部署 本地执行:Storm Topology是可进行本地运行的, 必须在发布前进行本地测试, 以确保代码本身业务逻辑没有问题( Windows也可执行, 但是由于权限等原因, ...
- 让django完成翻译,迁移数据库模型
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上篇我们完成了数据库模型的代码,但是还只 ...
- POJ 2503 Babelfish(map,字典树,快排+二分,hash)
题意:先构造一个词典,然后输入外文单词,输出相应的英语单词. 这道题有4种方法可以做: 1.map 2.字典树 3.快排+二分 4.hash表 参考博客:[解题报告]POJ_2503 字典树,MAP ...
- (转)C语言之原码、反码和补码
原码.反码和补码 1).数据在内存中存储的时候都是以二进制的形式存储的. int num = 10; 原码.反码.补码都是二进制.只不过是二进制的不同的表现形式. 数据是以补码的二进制存储的. 2). ...