Go 语言入门指南:基础语法和常用特性解析 | 青训营

97 阅读3分钟

这是我参与「第六届青训营 - 后端场」笔记创作活动的的第一篇笔记和第一篇实践文章,选题是Go 语言入门指南:基础语法和常用特性解析。其实我之前参加过过一次,暑假因为又实习又刷leetcode,还选了学校暑期很难的课导致不得不半途而废。希望这次能坚持下来,可能内容上会和上次有点点相似。

golang基础

  • go用切片比较多,很少用数组。

  • 在Go语言中,我们使用switch语句时,不需要使用break来退出,这与其他语言有些不同。同时,Go语言只有for这一种循环结构。

  • ":=" 这个符号只能在函数内部使用来声明和初始化变量。如果我们需要声明全局变量,就必须使用"var"关键字。

  • 在讨论值类型时,我们在传参的过程中需要考虑pointer。然而,在引用类型的情况下,我们在传递参数时并不需要考虑pointer。我发现字节课程并未提到这一点,实际上并不是所有的接收者都需要传递指针才能改变值。

  • 通过time.now(),我们可以获得当前的时间。不过我个人认为,如果你需要使用这个功能,查阅相关文档就足够了,没必要强记。

  • 如果你需要进行数字解析,可以使用strconv这个库。

  • 在处理字符串拼接优化的问题上,如果要拼接的字符串长度不一,使用string.builder是最优的选择,因为它可以有效地处理动态字符串拼接的问题,节约内存。然而,如果要拼接的字符串长度一致,编译器会对"+"操作进行优化,这种情况下使用"+"进行字符串拼接会更优,因为编译器可以预先知道总的字符串长度,从而一次性分配足够的内存。

  • 打印字段的格式:

image.png

  • 当我们将结构体的首字母都大写时,就可以使用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
}

猜谜游戏

image.png

代码生成 (refer from我之前写过的文章)

socks5 代理

image.png

  • go 开一个routine比其他语言开一个子线程消耗少很多,做大规模网络请求压力少很多。

  • defer函数和swift的defer用法一样,都是func退出的时候做一件事情。

  • bufio是待缓冲流,reader.ReaderByte效率很低需要优化。 github.com/wangkechun/…