1. Go 语言介绍
1.1 Go 语言的发展
Go 语言又称 Golang,起源于 2007 年,来自于谷歌内部的一个项目,于 2009 年正式对外发布。创始团队有三人,都是计算机界的大佬:
- Robert Griesemer:参与开发 Java HotSpot 虚拟机
- Rob Pike:Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言
- Ken Thompson:C 语言、Unix 和 Plan 9 的创始人之一
Go 语言是开源的,通过开源社区的力量得到了快速发展,越来越多的开发者开始使用 Go 语言。自 Go 语言发布以来,超过 200 名非谷歌员工贡献者对 Go 语言核心部分提交了超过 1000 个修改建议。在过去的 18 个月里,又有 150 开发者贡献了新的核心代码。
1. 命名规范
1.1 文件
Go 语言中,源文件以 .go
格式保存,例如 main.go
,且文件名只能由小写字母组成,若有多个单词,可以用下划线 _
进行拼接,例如 my_file.go
。
1.2 标识符
Go 语言中,标识符是区分大小写的,标识符必须以字符或 _
开头,后面可以跟 0 个或多个字符(字母、数字以及其他符号),例如 _
,_abc
,a1
,b_2
。同时标识符不能是 Go 语言中的保留关键字,不能以数字开头,也不能有运算符。
1. 常量
1.1 常量的定义
常量是一种特殊的变量,被初始化之后就无法再改变。
Go 语言中,常量的类型只能是布尔型,数字型(整型、浮点型和复数)和字符串型。
常量可以使用关键字 const
来定义,定义格式为 const variable [type] = value
。
前言
流程控制是每门语言控制程序逻辑和执行顺序的重要组成部分,Go 语言中常见的流程控制有 if
,for
,switch
;break
、continue
和 goto
是为了简化流程控制,降低代码复杂度。
数组
初始化
数组可以保存指定长度的多个数据,且这些数据的类型都相同,数据类型可以是原始类型,如整型和字符串等,也可以是自定义类型。
数组通过索引来访问元素,索引从 0
开始,第一个元素的索引为 0
,第二个为 1
,依此类推。
声明和初始化 Map
map
是一种特殊的数据结构,通过键 key
和值 value
来保存数据,可以快速地根据 key
找到其对应的 value
,与 python
中的字典和 Java
中的 HashMap
类似。
map
是引用类型,声明方式如下:
|
|
在声明的时候不需要知道 map
的长度,map
是可以动态增长的。
1. 使用接口的原因
我们来看一段代码:
|
|
上述代码中定义了狗 Dog
和猫 Cat
以及它们对应的方法 Say()
,若要继续添加鸭 Duck
方法和其对应的方法 Say()
,重复代码会非常多。我们可不可以从这三种动物类型中抽象出方法 Say()
,这就是接口的作用,接口可以定义抽象方法,来规范我们的代码。
反射是用程序检查其所拥有的结构,尤其是类型的一种能力。反射可以在运行时(不必在编译时)检查类型和变量,例如大小、变量、方法和动态调用这些方法。
方法和类型的反射
reflect
包提供了反射功能,它定义两个重要类型:Type
和 Value
,分别表示动态类型和值。
传递变长参数
如果函数最后一个参数采用 ...type
的形式,那么这个函数就可以处理一个变长参数(长度可以为 0),这样的函数被称为变参函数,如:
|
|
如果参数存储在切片 arr
中,可以用 arr...
来传递参数,如:
Go 没有像 Java 那样的 try/catch
异常处理机制,而是用 defer/panic/recover
机制来处理异常。
Go 语言的设计者认为 try/catch
机制使用过于泛滥,而且从底层向高层抛出错误太耗费资源,因此他给 Go 语言设计了一种返回值处理错误方式:通过在函数和方法中返回错误对象,这个错误对象一般在多个返回值的最后;如果返回 nil
,则表明没有错误,且主调函数应该检查并处理每一个错误。
基本概念
线程和进程
- 进程 :是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个 独立单位 。
- 线程 :是进程的一个执行实体,是 CPU 调度和分派的 基本单位 ,它是比进程更小的能独立运行的 基本单位 。
一个进程可以创建或撤销多个线程;同一个进程中的多个线程之间可以并发执行。