- lastOccurred[x]不存在,或者 < start --> 无需操作
- lastOccurred[x] >= start --> 更新start
- 更新lastOccurred[x], 更新maxLength
- 名字一般使用CamelCase
- 首字母大写: public
- 首字母小写: private
- 为结构定义的方法必须放在同一个包内
- 可以是不同的文件
- 如何扩充系统类型或者别人的类型
- 定义别名
- 使用组合
- 默认在~/go(unix, linux), %USERPROFILE%\go(windows)
- 官方推荐: 所有项目和第三方库都放在同一个GOPATH下
- 也可以将每个项目放在不同的GOPATH
- go get 命令
- 使用gopm来获取无法下载的包
- 接口由使用者定义
- 接口实现是隐式的
- 接口变量里面有什么:
- 接口变量自带指针
- 接口变量同样采用值传递, 几乎不需要使用接口的指针
- 指针接收者实现只能以指针的方式使用; 值接收者都可以
- 查看接口变量:
- 表示任何类型: interface{}
- Type Assertion
- Type Switch
- defer调用确保在函数结束时调用
- 参数在defer语句时计算
- defer列表为先进后出
- 何时使用defer:
- Open/Close
- Lock/Unlock
- printHeader/printFooter
- 协程 Coroutine
- 轻量级的"线程"
- 非抢占式多任务处理, 由协程主动交出控制权
- 编译器/解释器/虚拟机层面的多任务
- 多个协会才能可以在一个或多个线程上运行
- goroutine的定义:
- 任何函数只需要加上go就能送给调度器运行
- 不需要在调度时进行区分是否是异步函数
- 调度器在合适的点进行切换
- 使用-race来检测数据访问的冲突
- goroutine可能切换的点:
- I/O,select
- channel
- 等待锁
- 函数调用(有时)
- runtime.Gosched()