go语言基础

1. 标准库

标准库math中定义了各种数字类型的取值范围

const (
    MaxInt8   = 1<<7 - 1
    MinInt8   = -1 << 7
    MaxInt16  = 1<<15 - 1
    MinInt16  = -1 << 15
    MaxInt32  = 1<<31 - 1
    MinInt32  = -1 << 31
    MaxInt64  = 1<<63 - 1
    MinInt64  = -1 << 63
    MaxUint8  = 1<<8 - 1
    MaxUint16 = 1<<16 - 1
    MaxUint32 = 1<<32 - 1
    MaxUint64 = 1<<64 - 1
)

2. 三种内置引用类型

slice/map/channel

3. make和new区别

  • 内置函数new按制定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式;
  • 引用类型必须使用make函数创建,编译器将make转换为目标类型专用的创建函数,以确保完成全部内存分配和相关属性初始化;

4. 延迟调用

延迟调用注册的是调用,必须提供执行所需参数.参数值在注册时被复制并缓存起来.如对状态敏感,可改用指针或闭包.

func main(){
      x, y := 1, 2

      defer func(a int){
            fmt.Println("defer x, y = ", a, y)    // y为闭包引用
      }(x)    // 注册时复制调用参数

      x += 100
      y += 200
      fmt.Println(x, y)
}

输出

101 202
defer x, y = 1, 202

5. panic和recover

6. 内存对齐

对齐的原因与硬件平台,以及访问效率有关.某些平台只能访问特定地址,比如只能是偶数地址.而另一方面,CPU访问自然对齐的数据所需的读周期最少,还可避免拼接数据.

// slice本身并非动态数组或数组指针.它内部通过指针引用底层数组,设定相关属性将数据读写操作限定在制定区域内.
type slice struct{
      array unsafe.Pointer
      len int
      cap int
}     

7. golang中安全读写共享变量的方法?

  • sync.Mutex - 加锁
  • chan - 以通信来共享内存

8. 无缓冲chan的发送和接收是否同步?

ch := make(chan int)     // 无缓冲channel
ch := make(chan int, 5)  // 有缓冲channel
  • 无缓冲channel发送和接收需要同步
  • 有缓冲channel,缓冲未满时不要求同步,当缓冲满时写阻塞,当缓冲空时读阻塞;

9. golang的并发机制和CSP并发模型

posted @ 2020-12-19 22:54  yvhqbat  阅读(84)  评论(0)    收藏  举报