1.make&new
- new 分配对应类型的内存并返回对应类型的指针 new(map[string]int)只会分配一个指针的内存 指针指向map map并不会初始化
- make 创建并初始化 只适用slice/map/channel
2.切片
- 数组: 固定长度不可以扩容,作为参数时是值拷贝不是指针传递
- 切片: 可以扩容,作为函数参数时是指针传递
- copy: a.只能用作切片和数组
b.源不够长补0,源足够长截取
c.看视深拷贝,实则如果切片元素是指针copy时,源和目标切片内的元素指向是同一块内存 - 常用语法
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
- 在return表达式后执行
- 注册时压栈,执行时出栈
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.回调函数
- go语言中如果把某个类的对象a的函数作为参数传入是,在调用这个函数的时候就已经和a对象绑定了
7.init函数
- 全局变量初始化->init->main
- 如果不会使用到该包,但想调用该包的init可以使用匿名导入
- 有依赖关系包的init执行顺序是子包优先,没有依赖关系的包之间的init执行顺序不确定。所以不要依赖于init的执行顺序来写逻辑,只写配置的初始化
⬑ init执行顺序
8.package
- 被导入的包要在go mod的module项目下
- 一个文件夹只能有一个包名,子文件夹可以另外开包名
- 包不能相互导入,出现这个问题需要把公共代码另外开一个更小依赖的包
- 包和类一样,首字母大写为public
- 一个包可以有多个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
