Go语言开发踩坑记录
用Go开发游戏服务器有一段时间了,从基础语法到Pitaya框架,记录一下踩过的坑和学习心得。
环境搭建
安装配置
1 | # 查看Go版本 |
VS Code配置
- 安装Go扩展
- 配置GOPROXY加速:
1 | go env -w GOPROXY="https://goproxy.cn,direct" |
- 安装Go工具包:Ctrl+Shift+P → Go: Install/Update Tools
第一个程序
1 | package main |
运行:
1 | go run main.go |
基础语法踩坑
坑1:变量声明
Go的变量声明有几种方式:
1 | // 完整声明 |
注意:=只能在函数内使用,包级别变量要用var。
坑2:字符串长度
Go字符串是UTF-8编码,len()返回的是字节数,不是字符数。
1 | str := "Hello, Go语言!" |
切片和数组的区别
| 特性 | 数组 | 切片 |
|---|---|---|
| 长度 | 固定 | 可变 |
| 传递方式 | 值拷贝 | 引用传递 |
| 使用场景 | 固定大小数据 | 动态数据集合 |
1 | // 数组(固定长度) |
Map使用
1 | // 创建map |
流程控制
Switch特点
Go的switch默认break,不需要显式声明。
1 | switch day { |
for循环
1 | // 基本for循环 |
函数与错误处理
多返回值
1 | // 多返回值函数 |
错误处理
1 | // 自定义错误 |
Panic与Recover
1 | func mayPanic() { |
结构体与接口
结构体定义
1 | type Person struct { |
接口实现
1 | // 定义接口 |
Go的接口是隐式实现,只要实现方法集就是该类型。空接口interface{}可表示任意类型。
并发编程
Goroutine
1 | func sayHello() { |
Channel通信
1 | func producer(ch chan<- int) { |
Select多路复用
1 | ch1 := make(chan string) |
Sync包工具
1 | var wg sync.WaitGroup |
Go Modules
基本命令
1 | # 创建模块 |
go.mod示例:
1 | module github.com/example/myproject |
Pitaya游戏服务器
环境准备
1 | # 下载etcd |
坑3:依赖版本兼容
Pitaya对etcd和nats版本有要求,要用兼容的版本。另外注意go.mod里的replace指令,有时候需要替换某些依赖。
集群配置
1 | func clusterConfig() *config.PitayaConfig { |
单元测试
1 | func add(a, b int) int { |
总结
Go语言开发几点心得:
- 字符串长度用
[]rune转换后再取,避免中文问题 - 切片是引用类型,传递时要注意副作用
- 接口是隐式实现,不需要显式声明
- Channel记得关闭,否则可能goroutine泄漏
- Pitaya要注意etcd和nats版本兼容性
- 错误处理要习惯,Go没有try-catch
Go的并发模型确实很强大,但也要注意goroutine泄漏和死锁问题。多写测试用例,确保代码质量。