这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天。
前言
今天的主要内容,也是Go语言系列的第一门课程Go语言上手--基础语言。
本节课作为本合辑课程的开篇之课,将为大家详细讲解 Go 语言的相关背景知识。从开发环境、基础语法和标准库出发,协助同学轻松入门。
今天的这门课程一共分为两个大部分 第一部分是关于Go语言的背景的介绍,第二部分是 go语言的快速入门,包括开发环境搭建、基础语法速览和一些常用标准库的用法。
Go语言上手--基础语言
简介
什么是Go语言
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
字节跳动为什么全面拥抱Go语言
刚刚我们说道,字节跳动已经全面拥抱了go语言,为什么字节跳动会选择go语言呢?
最开始公司的后端业务主要是web后端,早期团队非Java背景,C++ 不太适合在线Web业务,所以最开始的服务都是python的。大概从2014年开始,随着业务体量的增长,python 遇到一些性能问题。 一些团队初步尝试使用了Go,发现入门很简单,开发效率高,性能也比较好。 go语言的开发和部署非常简单,顺带解决了之前python带来的很头疼的依赖库版本问题。 一些业务尝到甜头之后,后面开始公司级大力推广,诞生了公司内部的基于golang的rpc和http框架。 随着框架的推广,越来越多的python服务 使用golang重写,至今为止, golang已经成为内部使用率最高的编程语言。
可以归结为以下几个方面:
- 最初使用的Python, 由于性能问题换成了Go
- C++ 不太适合在线Web业务
- 早期团队非Java背景
- 性能比较好
- 部署简单、学习成本低
- 内部RPC和HTTP框架的推广
入门
开发环境
刚刚说过了go的应用场景,接下来讲一下如何配置go语言的开发环境。 配置go语言的开发环境分两步,第一步是安装go语言,第二步的话是配置go的集成开发环境
-
第一步: 安装Golang,这一步骤比较简单
我们可以直接浏览器输入go.dev打开Golang的官网,然后点击download然后按照提示就可以安装Golang。 如果有些同学打不开的话,那么可以尝试使用Golang中国的镜像studygolang.com/dl 如果你访问github的速度非常慢的话,你可以配置go mod proxy,打开gopropxy.cn/ 按照提示操作即可,配置完成你下载第三方包的速度会大大加快。
-
第二步的话是配置开发Golang的编辑器或者IDE。
go的开发环境可以选择VSCode或者Golang的,这是如今功能最多、使用最广泛的编辑器或者IDE。 VSCODE是一款由微软公司开发的,能运行在Mac OS X、Windows 和Linux上的跨平台开源代码编辑器。 虽然它是一款编辑器,但是它可以通过扩展程序为编辑器实现,包括代码高亮、代码提示编译调试、文档生成等功能,配置完成之后可以视为一个功能齐全的IDE。 安装VSCode,直接从官网下载安装即可,安装完成之后,需要在左边扩展里面搜索Go插件然后安装。 Goland是由JetBrains公司开发的一个新的商业IDE,相比vscode,它在重构、代码生成等方面做得更好。Goland是一个收费软件, 我们可以直接从官网下载,然后可以30天免费试用。对于在校学生可以申请免费的教育许可证。在校期间都可以直接免费使用。
基础语法
Helloworld
刚刚我们已经跟大家讲述了如何配置开发环境。接下来我们来通过一些小例子教大家快速学习一下go源代码的一些基础语法。我们先来看一下go语言的里面的helloword,helloworld 代码大概长这样子
第一行package main代表这个文件属于main包的一部分, main 包也就是程序的入口包。 第三行导入了标准库里面的FMT包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。 import下面是main函数,main 函数的话里面调用了fmt.Printn 输出helloword 要运行这个程序的话,我们就直接go run helloword.go。如果我们想编译成二进制的话,可以在go build来编译。编译完成之后直接./helloword就可以运行。 在FMT包里面还有很多的函数来做不同的输入输出格式化工作。大家可以在编辑器里面把鼠标悬浮在你的代码上,就可以看到每一个函数的文档。 你也可以进入pkg.go.dev,后面加你的包名比如FMT然后就能看到这个包的在线文档,可以从里面去挑选你需要的函数来使用。
变量
下面我们来看第二个例子,关于变量类型。 go语言是一门强类型语言,每一个变量都有它自己的变量类型。 常见的变量类型包括字符串、整数、浮点型、布尔型等。 go语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。 在go语言里面,大部分运算符的使用和优先级都和C或者C++类似,这里就不再概述。
下面讲述go语言里面的变量的声明,在go语言里面变量的声明有两种方式,一种是通过var name string=""这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。如果有需要,你也可以显示写出变量类型。另一种声明变量的方式是:使用变量冒号 := 等于值。
下面来讲说常量。常量的话就是把var改成const,值得一提的是go语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
循环
下面讲述go语言里面的循环,在go里面没有 while 循环、do while循环,只有唯一的一种for循环。最简单的for循环就是在for后面什么都不写,代表一个死循环。循环途中你可以用break跳出,也可以使用经典的C循环,就是for |等于0,|小于N|加加。这中间三段,任何一段都可以省略。 在循环里面,你可以用break或者continue来跳出或者继续循环。
数组
下面我们来介绍一下数组。 数组就是一个 具有编号且长度固定的元素序列。比如这里的话是一个可以存放 5个int元素的数组A。 对于一个数组,可以很方便地取特定索引的值或者往特定索引取存储值,然后也能够直接去打印一个数组。不过,在真实业务代码里面,我们很少直接使用数组,因为它长度是固定的,我们用的更多的是切片。
指针
go里面也支持指针。当然,相比C和C++里面的指针,支持的操作很有限。指针的一个主要用途就是对于传入参数进行修改。 我们来看这个函数。这个函数试图把一个变量 +2。但是单纯像上面这种写法其实是无效的。因为传入函数的参数实际上是一个拷贝, 那也说这个+2,是对那个拷贝进行了+2,并不起作用。 如果我们需要起作用的话,那么我们需要把那个类型写成指针类型,那么为了类型匹配,调用的时候会加一个&符号。
字符串操作
下面我们来看一下go语言 里面的字符串操作。在标准库strings包里面有很多常用的字符串工具函数,比如contains判断一个字符串里面是否有包含另一个字符串 ,count 字符串计数,index 查找某个字符串的位置。join 连接多个字符串,repeat重复多个字符串replace替换字符串。
Go语言上手--工程实践
并发编程
并发VS并行
- 多线程程序在一个核的cpu上运行
- 多线程程序在多个核的cpu上运行
Go可以充分发挥多核优势,高效运行
依赖管理
依赖指各种开发包,我们在开发项目中,需要学会站在巨人的肩膀上,也就是利用已经封装好的、经过验证的开发组件或工具来提升自己的研发效率。
- 依赖管理三要素
-
配置文件,描述依赖 ----> go.mod
-
中心仓库管理依赖库 ----> Proxy
-
本地工具 ----> go get/mod
-