Go语言基础| 青训营笔记

126 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

一. 本堂课重点内容

1.      Go语言基本特点

2.      开发环境

3.      基础语法

4.      工程实践

二.详细知识点介绍

Go语言基本特点:

1.高性能、高并发

2.语法简单、学习曲线平缓

3.丰富的标准库

4.完善的工具链

5.静态链接

6.快速编译

7.跨平台

8.垃圾回收

开发环境:

一.安装Golang:

官方网址:go.dev/

中国镜像源:studygolang.com/dl

github加速访问配置:goproxy.cn/

二. 集成开发环境:

可用开发环境:VSCode或Goland

云开发环境:gitpod.io/#github.com…

短链接: hi-hi.cn/gitpod

基础语法:

       Go语言是一门强类型语言,每个变量都有字节的变量类型。大部分运算符使用级和优先级与C和C++相似。在声明变量时,可通过var +变量名+类型 来声明,也可以通过 :=   的简洁声明,Go语言会自动匹配相应的变量类型,需要注意的一点是,简洁声明只适用在函数体内部。

       if-else语句:与C++等语言不同的一点时,if后不需要加括号。并且if后必须接大括号。

       循环:Go语言中没有while循环与do…while循环,只存在for循环,for循环后可不接参数,此时为死循环。循环内部可用break或continue来终止循环或继续循环。

       swich:Go语言中swich语句与C/C++语言类似,但是我们可以在case里面写条件分支来使代码更加简洁。

       数组:长度固定的元素序列。与C/C++类似,不再赘述

       切片:可以理解为可改变长度的数组,可利用make来创建切片,并通过append函数来扩展。当切片容量不够时则会进行扩容,具体的扩容机制为,少于1024个元素时,内存大小成倍扩涨,而大于1024个元素时,则以1.25的速度进行扩容。

       map:可理解为其他语言的哈希,或者字典。包含一个key类型和一个value类型,一个key对应于一个value。值得一提的是,map在存储的过程中,会刻意被打乱,所以在遍历输出时,不会按照插入顺序输出,而是随机输出。

       range:在遍历一个slice或者map时,可以利用range来快速遍历,遍历的返回值为索引和值,对于不需要的值,可以利用”-“占位符来忽略

       函数:比较特殊的一点:go语言的函数支持多个返回值,我们通常会在报错时返回错误信息。

       指针:类似于C/C++的指针,但是注意,go语言不支持对指针进行运算。另外,在go语言中,全部都是值传递,也就是说,接收的是一个复制后的结果,如果需要同时修改发送者和接收者,需要通过传递指针来实现

       结构体:是带类型字段的集合。在传递结构体时,使用指针可以提高性能。

       错误:我们通常使用一个返回值来传递错误信息,在返回值时,如果没有错误则返回结果和nil,如果有错误,则将结果和错误返回

       字符串操作:存在一些字符串工具函数比如contains判断一个字符串里面是否有包含另一个字符串,count字符串计数, index查找某个字符串的位置。join连接多个字符串repeat重复多个字符串replace替换字符串。

       Json: go语言里面的JSON操作非常简单,对于一个已有的结构体,我们可以什么都不做,只要保证每个字段的第个字母是大写,也就是是公开字段。那么这个结构体就能用JSON.marshaler去序列化,变成一个JSON的字符串。序列化之后的字符串也能够用JSON.unmarshaler去反序列化到一个空的变量里面。

这样默认序列化出来的字符串的话,它的风格是大写字母开头,而不是下划线。我们可以在后面用json tag等语法来去修改输出.JSON结果里面的字段名。

时间处理:在go语言里面最常用的就是time.now()来获取当前时间,然后你也可以用time.date去构造一个带时区的时间,构造完的时间。上面有很多方法来获取这个时间点的年月日小时分钟秒,然后也能用点sub去对两个时间进行减法,得到一个时间段。时间段又可以去得到它有多少小时,多少分钟、多少秒。

在和某些系统交互的时候,我们经常会用到时间戳。那您可以用.UNIX来获取时间戳。time.format time.parse

进程信息:在go里面,我们能够用os.argv来得到程序执行的时候的指定的命令行参数。比如我们编译的一个二进制文件,command。后面接abcd 来启动,输出就是os.argv会是一个长度为5的slice,第一个成员代表二进制自身的名字。我们可以用so.getenv来读取环境变量。

三. 实践练习例子

1.      猜谜游戏:

image.png

在这个例子中,首先,利用了随机函数,但如果没有随机数种子则会生成相同的随机数,为此,我们引入了时间作为随机数种子,可以通过os.Stdin函数来接收命令行内输入的数字,由于接受的是字符串格式,我们需要利用ReadString函数去掉换行符,再转为数字方便后续比较。在比较时利用了if-else语句进行判断大小,提示输出,而整个判断流程被包含在一个无参数的for死循环内。只有猜中时才能推出

2.      在线词典:

用户可以在命令行内查询一个单词,可以利用第三方的API来进行翻译,并打印。

过程:

首先需要进行抓包:

image.png 鼠标右键出现选项栏,点击检查,进入开发者模式。这时点击翻译,浏览器会发送一系列请求,这是一个HTTP的post请求,由于请求体是否复杂,我们可以利用第三方网站自动生成:curlconverter.com/#go

在生成代码之后可以试运行一下。

image.png 而此时输入是固定的,我们需要从变量中输入。所以要用到json序列化。常用的方式是构造出一个与json结构一一对应的结构体。

image.png

此时可以利用第二个网站:oktools.net/json2go。将生成的json字符串黏贴进去,就能生成对应的结构体。这样就得到了一个reponse结构体。

image.png

之后我们先订一个reponse结构体的对象,利用JSON.unmarshal把body反序列化到结构体内。之后再进行筛选结构体的内容进行打印。就完成了。

四. 课后个人总结

本章主要讲述了go语言的基础语法,并附带了项目的具体实践,初步感受了go语言的特点。

五. 引用参考

前言 · Go语言圣经 (studygolang.com)