- Channel之所以并发安全的原因是通过复制内存的方式来进行共享内存。
- main.go 文件中 init 方法会在 main 方法之前执行
- main方法在main包中才会编译出可执行文件
- import 语句中的下划线“_”,其实就是初始化后面引入的包,调用包中的init方法
- package中小写字母开头的变量是不可导出(不可被其他包访问)的,而大写字母开头的变量是可以导出的,可以通过函数返回不可导出的变量
- 引用型的变量不初始化就使用会报错,因为引用变量的默认值是nil
- var关键字会将变量初始化为它的零值,而:=关键字则不是,可以是一个函数调用的返回也可以是自定义的初始化方法。
- 在main方法结束前来结束所有的go协程会减少bug和错误
- for range 的第二个参数其实就是value的复制元素
- 函数传参都是值拷贝
- 定义常量时不需要指定类型
- 定义接口时,若方法只有一个,那么它的命名需要加上后缀“er”
- 若调用对象为引用类型,函数的接收者为值类型,那么编译器就会自动的进行对象反引用,反之亦然
- 接收类型为引用类型的方法不能被赋值为值的接口调用,接收类型为值类型的方法,可以被赋值类型为引用类型和值类型的接口调用
- 接口类型的实现可以是某个类的引用类型也可以是值类型
- array := […]int{10, 20, 30, 40, 50} 这种方式声明数组无需指定数组长度
- array := [5]int{1: 10, 2: 20} 指定特定位置为固定的值
- slice := []int{10, 20, 30, 40, 50} 创建长度为5的数组切片
- 一个线程绑定到一个逻辑处理器上,多个协程被添加到逻辑任务队列中,由go运行时调度器进行调度,当有一个协程调用了系统blocking syscall后,这个线程就会从该逻辑处理器中卸下来,继续等待,调度器会再创建一个线程来绑定到该逻辑处理器上,并从运行队列中挑选一个go协程来运行。
- 若一个go协程需要进行一个网络I/O调用,那么该协程就会从逻辑处理器上卸下来并转移到由go运行时构造的网络轮询器上,当轮询器检测到读或写操作准备好后,该go协程就会重新调度到逻辑处理器上去处理相应的操作
- 默认的运行时可以启动的线程数是10000,这个值可以通过SetMaxThreads方法更改,当线程数超过最大值,程序将崩溃。
- 并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
- 并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
- 若想go协程真正的并行运行,那么就必须运行的多物理处理器的机器上若机器只有一个处理器,就算是多线程也只是并发而已
- 单元测试的方法必须以Test开头,接收参数是Test的指针类型,无返回值,这样才能被识别为单元测试方法
comments powered by