1.make&new
  1. new 分配对应类型的内存并返回对应类型的指针 new(map[string]int)只会分配一个指针的内存 指针指向map map并不会初始化
  2. make 创建并初始化 只适用slice/map/channel
2.切片
  1. 数组: 固定长度不可以扩容,作为参数时是值拷贝不是指针传递
  2. 切片: 可以扩容,作为函数参数时是指针传递
  3. copy: a.只能用作切片和数组
       b.源不够长补0,源足够长截取
       c.看视深拷贝,实则如果切片元素是指针copy时,源和目标切片内的元素指向是同一块内存
  4. 常用语法
    arr := make([]int, 7, 8)           //7为切片长度 8为容量
    arr = arr[1:]                      //截断
    arr = append(arr[:0], arr[1:]...)  //拼接
    copy(arr2, arr[2:4])               //切片深拷贝 元素浅拷贝
3.list.List l:list e:element
l.Init()       //初始换
l.PushFront()  //头插
l.PushBack()   //尾插
l.Front()      //找到第一个元素
l.Back()       //找到最后一个元素
e.Next()       //后面一个元素
l.Remove(e)    //删除某个元素
4.defer
  1. 在return表达式后执行
  2. 注册时压栈,执行时出栈
    func test() (n int, err error) {
     defer fmt.Println(1)
     defer fmt.Println(2)
     defer fmt.Println(3)
     return fmt.Println("xx")
    }
    func main() {
     _, _ = test()
    }
    xx
    3
    2
    1
5.sync.Once
var initOnce sync.Once
func funcA(){
    initOnce.Do(func() {
        funcDoOnce() //延迟初始化+只执行一次
    })
}
6.回调函数
  1. go语言中如果把某个类的对象a的函数作为参数传入是,在调用这个函数的时候就已经和a对象绑定了
7.init函数
  1. 全局变量初始化->init->main
  2. 如果不会使用到该包,但想调用该包的init可以使用匿名导入
  3. 有依赖关系包的init执行顺序是子包优先,没有依赖关系的包之间的init执行顺序不确定。所以不要依赖于init的执行顺序来写逻辑,只写配置的初始化
  4. ⬑ init执行顺序
8.package
  1. 被导入的包要在go mod的module项目下
  2. 一个文件夹只能有一个包名,子文件夹可以另外开包名
  3. 包不能相互导入,出现这个问题需要把公共代码另外开一个更小依赖的包
  4. 包和类一样,首字母大写为public
  5. 一个包可以有多个init函数
9.tag 实现编译时的多态
├── main.go
├── rpc.go
├── etc
│   └── 不同环境的配置
├── framework
│   └── 框架代码  //调用impl/instance的代码接口实现编译时的多态(编译时指定tag)
├── games
│   ├── balloontap
│   │   └── 某个游戏的本地代码
│   └── goldmaster
│       └── 某个游戏的本地代码
├── impl
│   ├── 定义游戏的接口 给框架层调用
│   └── 游戏的接口给个默认定义default 游戏要继承这个default
├── instance
│   ├── balloontap.go  //指定tag为balloontap
│   └── goldmaster.go  //指定tag为goldmaster
├── share
│   └── comm.go  //写框架和游戏都要调用或多个游戏需要调用的代码 (缺点需要传很多参数不能直接把一个对象传过来 因为这里是最小包体)
├── rds
│   └── keys.go  //最最小包体 share可以引用
10.sync.Pool 对象池
文档更新时间: 2026-06-30 16:41   作者:morninglu