Golang,CPP,C#编程语言笔记
记录了golang,cpp,c#语言的一些知识,方便我在某些混乱时刻可以想到它。
Golang
Go 的协程(goroutines)常见的使用场景:
处理玩家连接:
每个玩家连接可以由一个独立的协程处理,包括接收和发送消息、维护玩家状态等。
示例:使用 net 包接收玩家连接并启动一个新的协程处理每个连接。
游戏逻辑计算:
将复杂的游戏逻辑计算分配到多个协程中执行,如物理模拟、AI 计算等。
示例:在不同的协程中并行处理多个 AI 角色的决策逻辑。
网络通信:
处理与客户端或其他服务器的网络通信,包括消息的发送和接收、协议解析等。
示例:使用 net/http 或 websocket 包在协程中处理 HTTP 请求或 WebSocket 消息。
定时任务:
处理定时任务,如定期保存游戏状态、定时刷新游戏世界等。
示例:使用 time.Ticker 定时器在协程中执行周期性任务。
资源加载和管理:
异步加载和管理游戏资源,如地图、音效、图形资源等。
示例:在协程中加载资源文件并将结果返回给主线程。
日志记录:
异步记录游戏日志,以提高日志记录效率并避免阻塞主线程。
示例:在协程中写入日志文件或发送日志到远程服务器。
数据库操作:
异步执行数据库查询和更新操作,以提高数据库访问效率。
示例:在协程中执行数据库查询,并将结果返回给主线程处理。
消息队列处理:
处理来自消息队列的消息,如任务队列、事件队列等。
示例:使用 channel 传递消息,并在协程中处理这些消息。
实时同步:
实时同步游戏状态,如玩家位置、动作等,以实现多人游戏的实时交互。
示例:在协程中处理玩家位置更新,并广播给其他玩家。
go异步编程的一些技巧
使用waitgroup
通过Add()方法增加等待的协程数量,Done()方法标记协程完成,Wait()方法阻塞直到所有协程完成。如完成一个下载任务。
// 创建一个等待组,用于等待所有协程完成
var wg sync.WaitGroup
// 创建下载任务列表
tasks := []DownloadTask{
{
URL: "https://example.com/file1.txt",
Filename: "file1.txt",
Action: func(filename string) { fmt.Printf("Download completed: %s\n", filename) },
},
{
URL: "https://example.com/file2.txt",
Filename: "file2.txt",
Action: func(filename string) { fmt.Printf("Download completed: %s\n", filename) },
},
// 添加更多下载任务
}
for _, task := range tasks {
wg.Add(1)
// 启动一个协程来下载文件
go func(task DownloadTask) {
defer wg.Done()
err := downloadFile(task.URL, task.Filename)
if err != nil {
fmt.Printf("Error downloading file %s: %v\n", task.Filename, err)
return
}
// 下载完成后执行指定的行为
task.Action(task.Filename)
}(task)
}
// 等待所有下载任务完成
wg.Wait()
fmt.Println("All downloads completed.")
使用select实现异步等待,搭配time.after()实现超时控制
sync.Once()只做一次的操作,多个协程中只调用一次。
golang如何实现枚举?
使用iota,实例:
// 房间状态,0表示等待,1表示正在进行,2表示结束
type RoomStatus int
const (
RoomWaiting RoomStatus = iota
RoomActive
RoomEnded
)
C++
C++泛型
泛型通过template实现。
std标准库提供了很多泛型容器:
std::vector:动态数组。
std::list:双向链表。
std::deque:双端队列。
std::set 和 std::unordered_set:集合。
std::map 和 std::unordered_map:关联数组。
std::stack:栈。
std::queue:队列。
std::priority_queue:优先队列。
Csharp
常用数据结构
数组 (Array)
固定大小的元素集合,可以通过索引访问。
示例:int[] numbers = new int[5];
列表 (List
可变大小的元素集合,提供动态数组的功能。
示例:List
链表 (LinkedList)
每个元素包含指向下一个和上一个元素的指针,适用于频繁插入和删除操作的场景。
示例:LinkedList
队列 (Queue)
先进先出 (FIFO) 的集合,适用于排队处理的场景。
示例:Queue
栈 (Stack)
后进先出 (LIFO) 的集合,适用于需要逆序处理的场景。
示例:Stack
字典 (Dictionary<TKey, TValue>)
键值对的集合,适用于快速查找值的场景。
示例:Dictionary<string, int> dictionary = new Dictionary<string, int>();
哈希集 (HashSet)
无序的唯一元素集合,适用于快速查找和唯一性判断的场景。
示例:HashSet
排序字典 (SortedDictionary<TKey, TValue>)
键值对的集合,键按顺序排列,适用于需要有序访问的场景。
示例:SortedDictionary<string, int> sortedDictionary = new SortedDictionary<string, int>();
排序集 (SortedSet)
无序且唯一的元素集合,元素按顺序排列。
示例:SortedSet
双端队列 (Deque)
既可以从两端插入和删除元素的集合。
示例:.NET Standard 库中没有直接的 Deque 实现,但可以使用 LinkedList