第一章 关于Go语言的介绍

1.1 用 Go 解决现代编程难题

1.1.2 并发

需要注意的是,如果在通道中传递的是指向数据的指针,而且读和写是在不同的goroutine完成的,则会出现问题,需要加锁进行控制

在Golang中对于并发问题的控制,优先要用通道的解决办法,这是语言设计的思想,在用通道实现比较麻烦的情况下可以用锁来实现

比如:

package main

import (
    "fmt"
    "sync"
)

func main() {
    // 利用通道
    done := make(chan int, 1)

    go func() {
        fmt.Println("你好, 世界")
        done <- 1
    }()

    <-done

    // 利用锁
    var lock sync.Mutex

    lock.Lock()
    go func() {
        fmt.Println("hello")
        lock.Unlock()
    }()

    lock.Lock()
}
1.1.3 Go 语言的类型系统

Go语言也同样支持面向对象开发,但是采用的思路是组合而不是继承

image-20201104154409620

第3章 打3包和工具链

3.1 包

3.1.1 包名惯例

包名一般和目录同名,小写

3.1.2 main 包

go语言程序中必须有一个main的包,go语言编译的时候会把这个包编译为可执行的二进制文件

3.5 进一步介绍 Go 开发工具

3.5.1 go vet

vet 命令会检测代码的常见错误

3.5.2 Go 代码格式化

要多使用 go fmt

3.6 与其他Go开发者合作

  1. 包应该在代码库的根目录中。golang的包最好不要嵌套文件目录,都全部放在项目根目录下,因为导入一个包是需要导入全路径的,如果嵌套的多,那么导入的路径就会很长。

第4章 数组、切片和映射

4.1 数组的内部实现和基础功能

4.1.5 在函数间传递数组

golang中函数传递是值传递,如果传递一个大数组,内存消耗会很大,尽量在函数内传递指针,但是要小心修改指针指向的数据

4.2 切片的内部实现和基础功能

切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。

切片有三个数据结构,分别是:地址指针、长度和容量

4.2.2 创建和初始化

nil切片,通常用来描述一个不存在的切片,比如函数返回切片,但是中途异常,就可以返回nil切片

var slice []int

空切片,顾名思义,比如用在查询数据库为0的情况

slice := make([]int)
slice := []int{}