学习心得
这门课主要学习了以下知识
- Go语言简介:Go语言是一种高性能、高并发的编程语言,具有简单的语法、丰富的标准库、完善的工具链、静态链接、快速编译、跨平台、垃圾回收等特点。
- Go语言应用场景:Go语言广泛应用于云计算、微服务、大数据、区块链、物联网等领域,也是许多云原生组件(如Docker、Kubernetes、Istio等)的开发语言。
- Go语言在字节跳动的应用:字节跳动全面拥抱Go语言,主要是因为Go语言的性能优越,部署简单,学习成本低,以及内部RPC和HTTP框架的推广。
- Go语言开发环境:介绍了如何安装Go语言,配置集成开发环境(IDE),以及基于云的开发环境。
- Go语言基础语法:包括Hello World程序的编写和运行,变量类型和声明,常量,条件语句,循环,switch分支结构,切片,range,指针,结构体,错误处理,字符串操作,JSON操作,时间处理,数字解析,进程信息等。
Go语言的简洁性和高效性让我印象深刻。它的并发模型使得编写高并发程序变得简单,而丰富的标准库则提供了大量实用的功能。同时,Go语言的静态类型系统和强大的工具链也大大提高了开发效率。总的来说,我认为Go语言是一种非常实用和高效的编程语言,值得深入学习。
补充学习
- 并发编程:Go语言的并发模型是其核心特性之一,理解goroutine和channel的使用对于掌握Go语言至关重要。
- 接口和类型系统:Go语言的接口和类型系统是其独特的特性,理解这些概念可以帮助你编写更灵活和强大的Go代码。
- 错误处理和异常:Go语言的错误处理模型与许多其他语言不同,理解如何有效地处理错误和异常是编写健壮的Go代码的关键。
- 测试和调试:了解Go语言的测试框架和调试工具可以帮助你编写高质量的代码并快速定位问题。
- 包管理:Go语言的包管理工具如Go Modules,可以帮助你更好地组织和管理你的代码。
- 网络编程:Go语言在网络编程方面非常强大,我也在阅读活动中学习了go web 开发入门
现补充完整学习笔记(上半)如下:
简介
1.1 什么是 Go 语言
-
高性能、高井发
-
语法简单、学习曲线平缓
-
丰富的标准库
-
完善的工具链
-
静态链接
-
快速编译
-
跨平台
-
垃圾回收
1.2 应用场景——业务维度划分
-
云计算
-
微服务
-
大数据
-
区块链
-
物联网
-
云原生组件
-
docker
-
kubernetes
-
istio
-
etcd
-
prometheus
1.3 字节跳动为什么全面拥怉 Go 语言
-
最初使用的 Python,由于性能问题换成了 Go
-
cpp不太适合在线 Web 业务
-
早期团队非 Java 背景
-
性能比较好
-
部署简单、学习成本低
-
内部 RPC 和 HTTP 框架的推广
基于golang的rpc和http框架
框架推广后,python服务使用golang重写
入门
开发环境
2.1 开发环境 - 安装 Golang
studygolang.com/dl 中国镜像
goproxy.cn/ 访问github速度慢,可配置go mod proxy
2.1 开发环境 - 配置 集成开发环境(IDE)
配置开发 Golang 的编辑器或者 IDE,go的开发环境可以选择 VSCode 或者 Golang 的,这是如今功能最多、使用最广泛的编辑器或者 IDE。
安装 VSCode ,直接从官网下载安装即可,安装完成之后,需要在左边扩展里面搜索 Go 插件然后安装。
Goland 是由 JetBrains 公司开发的一个新的商业 IDE,相比 vscode ,它在重构、代码生成等方面做得更好。Goland 是一个收费软件,我们可以直接从官网下载,然后可以 30 天免费试用。对于在校学生可以申请免费的教育许可证。在校期间都可以直接免费使用。
2.1 开发环境 - 基于云的开发环境
gitpods.IO
基础语法
helloworld
解构
第一行 package main 代表这个文件属于 main 包的一部分,main 包也就是程序的入口包
第三行 import ("fmt")导入了标准库里面的 FMT 包。
-
这个包主要是用来往屏幕输入输出字符串、格式化字符串。
-
在 FMT 包里面还有很多的函数来做不同的输入输出格式化工作。
- 你也可以进入 pkg.go.dev ,后面加你的包名 fmt - Search Results - Go Packages
- 比如 FMT 然后就能看到这个包的在线文档,可以从里面去挑选你需要的函数来使用。
import 下面是 main 函数,main 函数的话里面调用了 fmt.Println 输出 helloword
运行
方法一
- go run helloword.go
方法二
- 编译成二进制 go build 来编译。
- 编译完成之后直接./helloword就可以运行。
变量类型
简介
go语言是一门强类型语言,每一个变量都有它自己的变量类型。
常见的变量类型包括
-
字符串
- go 语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。
-
整数
-
浮点型、
-
布尔型等。
在go语言里面,大部分运算符的使用和优先级都和 C 或者 C++ 类似.
变量声明
两种方式
- 一种是通过 var name string = "" 这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。如果有需要,你也可以显式写出变量类型。
- 另一种声明变量的方式是: 使用变量 := 值。
常量
常量的话就是把 var 改成const,
go语言里面的常量,没有确定的类型,会根据使用的上下文来自动确定类型。
条件语句 if else。
go语言 里面的 if else 写法和 C 或者 C++ 类似。
- 不同点是 if 后面没有括号。如果你写括号的话,那么在保存的时候你的编辑器会自动把你去掉。
- 第二个不同点是 Golang 里面的if ,它必须后面接大括号,就是你不能像 C 或者 C++ 一样,直接把 if 里面的语句同一行。
循环
在go里面没有 while 循环、do while 循环,只有唯一的一种 for 循环。
最简单的 for 循环就是在 for 后面什么都不写,代表一个死循环。
循环途中你可以用 break 跳出,也可以使用经典的 C 循环,就是 for I 等于0, I 小于 NI 加加。这中间三段,任何一段都可以省略。在循环里面,你可以用 break 或者 continue 来跳出或者继续循环,
switch 分支结构
go语言里面的 switch 分支结构。看起来也 C 或者 C++ 比较类似。同样的在 switch 后面的那个变量名,并不是要括号。这里有个很大的一点不同的是,在c++里面, switch case 如果不不显示加 break 的话会然后会继续往下跑完所有的 case, 在go语言里面的话是不需要加 break 的。相比 C 或者 C++ , go语言里面的 switch 功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的 if else 语句。你可以在 switch 后面不加任何的变量,然后在 case 里面写条件分支。这样代码相比你用多个 if else 代码逻辑会更为清晰。
切片
不同于数组可以任意更改长度,然后也有更多丰富的操作。比如说我们可以用 make 来创建一个切片,可以像数组一样去取值,使用 append 来追加元素。注意 append 的用法的话,你必须把 append 的结果赋值为原数组。因为 slice 的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行 append 操作的时候,如果容量不够的话,会扩容并且返回新的 slice。slice 此初始化的时候也可以指定长度。slice 拥有像 python 一样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括第五个元素。不过不同于python,这里不支持负数索引
range
对于一个 slice 或者一个 map 的话,我们可以用 range 来快速遍历,这样代码能够更加简洁。 range 遍历的时候,对于数组会返回两个值,第一个是索引,第二个是对应位置的值。如果我们不需要索引的话,我们可以用下划线来忽略。
支持指针
当然,相比 C 和 C++ 里面的指针,支持的操作很有限。指针的一个主要用途就是对于传入参数进行修改。我们来看这个函数。这个函数试图把一个变量+2。但是单纯像上面这种写法其实是无效的。因为传入函数的参数实际上是一个拷贝,那也说这个+2,是对那个拷贝进行了+2, 并不起作用。如果我们需要起作用的话,那么我们需要把那个类型写成指针类型,那么为了类型匹配,调用的时候会加一个 & 符号。
结构体
结构体的话是带类型的字段的集合。比如这里 user 结构包含了两个字段,name 和 password。我们可以用结构体的名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。同样的结构体我们也能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。
在 Golang 里面可以为结构体去定义一些方法。会有一点类似其他语言里面的类成员函数。 比如这里,我们把上面一个例子的 checkPassword 的实现,从一个普通函数,改成了 结构体方法。 这样用户可以 像 a.checkPassword(“xx”) 这样去调用。 具体的代码修改,就是把第一个参数,加上括号,写到函数名称前面。
在实现结构体的方法的时候也有两种写法,一种是带指针,一种是不带指针。这个它们的区别的话是说如果你带指针的话,那你那么你就可以对这个结构体去做修改。如果你不带指针的话,那你实际上操作的是一个拷贝,你就无法对结构体进行修改。
错误处理
在 go 语言里面符合语言习惯的做法就是使用一个单独的返回值来传递错误信息。不同于 Java 自家家使用的异常。go语言的处理方式,能够很清晰地知道哪个函数返回了错误,并且能用简单的 if else 来处理错误。在函数里面,我们可以在那个函数的返回值类型里面,后面加一个 error, 就代表这个函数可能会返回错误。那么在函数实现的时候, return 需要同时 return 两个值,要么就是如果出现错误的话,那么可以 return nil 和一个 error。如果没有的话,那么返回原本的结果和 nil。
字符串操作
在标准库 strings 包里面有很多常用的字符串工具函数,比如 contains 判断一个字符串里面是否有包含另一个字符串 , count 字符串计数, index 查找某个字符串的位置。 join 连接多个字符串 repeat 重复多个字符串 replace 替换字符串。
字符串格式化
- 在标准库的 FMT 包里面有很多的字符串格式相关的方法,比如 printf 这个类似于 C 语言里面的 printf 函数。不同的是,在go语言里面的话,你可以很轻松地用 %v 来打印任意类型的变量,而不需要区分数字字符串。你也可以用 %+v 打印详细结果,%#v 则更详细。
JSON 操作
- go语言 里面的 JSON 操作非常简单,对于一个已有的结构体,我们可以什么都不做,只要保证每个字段的第一个字母是大写,也就是是公开字段。那么这个结构体就能用 JSON.marshaler 去序列化,变成一个 JSON 的字符串。序列化之后的字符串也能够用 JSON.unmarshaler 去反序列化到一个空的变量里面。这样默认序列化出来的字符串的话,它的风格是大写字母开头,而不是下划线。我们可以在后面用 json tag 等语法来去修改输出 JSON 结果里面的字段名。
时间处理
- 在go语言里面最常用的就是 time.now() 来获取当前时间,然后你也可以用 time.date 去构造一个带时区的时间,构造完的时间。上面有很多方法来获取这个时间点的年月日小时分钟秒,然后也能用点 sub 去对两个时间进行减法,得到一个时间段。时间段又可以去得到它有多少小时,多少分钟、多少秒。在和某些系统交互的时候,我们经常会用到时间戳。那您可以用 .UNIX 来获取时间戳。time.format time.parse
数字解析
-
字符串和数字之间的转换
- 在 go 语言当中,关于字符串和数字类型之间的转换都在 STR conv 这个包下,这个包是 string convert 这两个单词的缩写。我们可以用 parseInt 或者 parseFloat 来解析一个字符串。 parseint 参数我们可以用 Atoi 把一个十进制字符串转成数字。可以用 itoA 把数字转成字符串。如果输入不合法,那么这些函数都会返回error
进程信息
在 go 里面,我们能够用 os.argv 来得到程序执行的时候的指定的命令行参数。比如我们编译的一个 二进制文件,command。 后面接 abcd 来启动,输出就是 os.argv 会是一个长度为 5 的 slice ,第一个成员代表二进制自身的名字。我们可以用 so.getenv来读取环境变量。exec
标准库
待补充