这是我参与「第六届青训营 - 后端场」笔记创作活动的的第一篇笔记和第一篇实践文章,选题是Go 语言入门指南:基础语法和常用特性解析。其实我之前参加过过一次,暑假因为又实习又刷leetcode,还选了学校暑期很难的课导致不得不半途而废。希望这次能坚持下来,可能内容上会和上次有点点相似。
golang基础
- 文档链接:pkg.go.dev/std
- go tool in vs code下载失败: goproxy.cn/
-
go用切片比较多,很少用数组。
-
在Go语言中,我们使用switch语句时,不需要使用break来退出,这与其他语言有些不同。同时,Go语言只有for这一种循环结构。
-
":=" 这个符号只能在函数内部使用来声明和初始化变量。如果我们需要声明全局变量,就必须使用"var"关键字。
-
在讨论值类型时,我们在传参的过程中需要考虑pointer。然而,在引用类型的情况下,我们在传递参数时并不需要考虑pointer。我发现字节课程并未提到这一点,实际上并不是所有的接收者都需要传递指针才能改变值。
-
通过time.now(),我们可以获得当前的时间。不过我个人认为,如果你需要使用这个功能,查阅相关文档就足够了,没必要强记。
-
如果你需要进行数字解析,可以使用strconv这个库。
-
在处理字符串拼接优化的问题上,如果要拼接的字符串长度不一,使用string.builder是最优的选择,因为它可以有效地处理动态字符串拼接的问题,节约内存。然而,如果要拼接的字符串长度一致,编译器会对"+"操作进行优化,这种情况下使用"+"进行字符串拼接会更优,因为编译器可以预先知道总的字符串长度,从而一次性分配足够的内存。
-
打印字段的格式:
- 当我们将结构体的首字母都大写时,就可以使用json.Marshal进行序列化。但如果直接打印出来,我们只会看到十六进制的编码。若想进行反序列化,我们可以使用json.unmarshal。
两大特性
Go 的一大特点是其对并发编程的内建支持,主要是通过 Goroutines 和 Channels 实现的。
goCopy code
// Goroutine
go func() {
fmt.Println("I'm running in a goroutine")
}()
// Channel
ch := make(chan int)
go func() {
ch <- 1
}()
x := <-ch
字节的课没说,其实加上go这个关键字就可以做到开启routine。但是有两种:
go checkLink(link, channel)调起一个function- 用匿名函数
go
复制代码
go func(link, channel) {
// implementation
}
结构体和接口
Go 使用结构体(struct)和接口(interface)来实现面向对象编程。
goCopy code
type Animal struct {
Name string
Sound string
}
type Speaker interface {
Speak() string
}
func (a Animal) Speak() string {
return a.Sound
}
猜谜游戏
代码生成 (refer from我之前写过的文章)
- 网络请求代码(网页有使用说明): curlconverter.com/#go
- 网络response解析代码(网页有使用说明):oktools.net/json2go
socks5 代理
-
go 开一个routine比其他语言开一个子线程消耗少很多,做大规模网络请求压力少很多。
-
defer函数和swift的defer用法一样,都是func退出的时候做一件事情。
-
bufio是待缓冲流,
reader.ReaderByte效率很低需要优化。 github.com/wangkechun/…