Go 语言入门指南 | 青训营

97 阅读6分钟

Go语言是Google出品的一门通用型计算机编程语言,是一门高性能、高并发的编程语言,具有与C++、Java相媲美的高性能,很多时候被描述为“类C语言”,或者是“21世纪的C语言”。

基础语法

Go语言的语法简单易懂,语法风格类似于C语言,并且在C语言的基础上进行了大幅度的简化,比如去掉了不需要的表达式括号,循环也只有for循环一种表示方法,就可以同时实现数值、键值等的各种遍历。

变量

Go语言是一门强类型语言,每一个变量都有它自己的变量类型,常见的变量类型包括字符串、整数、浮点型、布尔型等。 image.png

  • 字符串是内置类型,可以直接通过加号拼接,也能够直接用等号去比较两个字符串;

  • 变量的声明有两种方式, 一种是通过var name =" "这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。也可以显示写出变量类型;

  • 另一种声明变量的方式是: 变量:= 值;

  • 常量的声明就是把var改成const。Go语言里面的常量,它没有确定的类型,会根据上下文来自动确定类型。

if else

Go语言里的if else写法和C、C++类似。 image.png 不同点在于:

  • if后面没有括号,写了括号也会在保存时被编辑器自动去掉;
  • if后面必须接大括号而不能直接跟里面的语句写在同一行。

循环

Go里面没有while、do while循环,只有for循环。 image.png

  • 最简单的for循环就是在for后面什么都不写,代表一个死循环;
  • 可以使用经典的C循环,其中间三段任何一段都可以省略;
  • 在循环里面,可以用break或者continue来跳出或者继续循环。

switch

Go语言里面的switch分支结构,看起来也跟C或者C++比较类似。 image.png

  • 在switch后面的那个变量名,并不需要括号;
  • 在c++里面,switch case如果不显示加break的话会继续往下跑完所有的case,在Go语言里面的话是不需要加break的;
  • 相比C或者C++,Go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。可以在switch后面不加任何的变量,然后在case里面写条件分支。这样代码相比用多个if else代码逻辑会更为清晰。

数组

数组就是一个具有编号且长度固定的元素序列。 image.png 比如这里的话是一个可以存放5个int元素的数组a。对于一个数组,可以很方便地取特定索引的值或者往特定索引存储值,然后也能够直接去打印一个数组。

切片

切片不同于数组可以任意更改长度,然后也有更多丰富的操作。 image.png 比如可以用make来创建一个切片,可以像数组一样去取值,使用append来追加元素。注意append的用法的话,你必须把append的结果赋值为原数组。因为slice的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行append操作的时候,如果容量不够的话,会扩容并且返回新的slice。slice此初始化的时候也可以指定长度。slice拥有像python 一样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括第五个元素。不过不同于python,这里不支持负数索引。

map

map是实际使用过程中最频繁用到的数据结构。 image.png 用make来创建一个空map,这里会需要两个类型,第一个是key的类型,这里是string;另一个是value的类型,这里是int。可以从里面去存储或者取出键值对,也可以用delete从里面删除键值对。Go的map是完全无序的,遍历的时候不会按照字母顺序,也不会按照插入顺序输出,而是随机顺序。

range

对于一个slice或者一个map,可以用range来快速遍历。 image.png range遍历的时候,对于数组会返回两个值,第一个是索引,第二个是对应位置的值。如果我们不需要索引的话,我们可以用下划线来忽略。

函数

这个是Go里面一个简单的实现两个变量相加的函数。 image.png Go和其他很多语言不一样的是,变量类型是后置的。Golang里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。

指针

Go里面也支持指针,不过支持的操作很有限。 image.png

指针的一个主要用途就是对于传入参数进行修改。这个函数试图把一个变量+2。但是单纯像上面这种写法其实是无效的。因为传入函数的参数实际上是一个拷贝,那也说这个+2,是对那个拷贝进行了+2,并不起作用。如果需要起作用的话,需要把那个类型写成指针类型,为了类型匹配,调用的时候会加一个&符号。

结构体

结构体是带类型的字段的集合。 image.png 这里user结构包含了两个字段,name和password。可以用结构体的名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。同样的结构体我们也能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。

常用特性

静态链接

在Go语言里面,所有的编译结果默认都是静态链接的。只需要拷贝编译之后的唯一一个可执行文件,不需要附加任何东西用来部署运行。其他常见的编程语言,比如JAVA需要附加一个庞大的jre才可以运行。

快速编译

Go语言拥有静态语言里面几乎最快的编译速度,在本地开发的时候,几乎任何时候修改完一行代码,都能够在一秒钟左右增量编译完成。这个速度对于C++开发者来说,几乎不可想象。

跨平台

Go语言本身能够在常见的Linux,macOS的操作系统下面运行,也能够用来开发安卓,iOS软件。还能在各种奇奇怪怪的设备上去运行,包括路由器。还有很方便的交叉编译特性,能够轻易的在笔记本上编译出来一个二进制文件拷贝到路由器上面运行,而无需配置交叉编译环境。

垃圾回收

Go语言是一门带垃圾回收的语言,和JAVA类似,写代码的时候,无需考虑内存的分配释放,可以专注于业务逻辑。