记录了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 numbers = new List();

链表 (LinkedList)

每个元素包含指向下一个和上一个元素的指针,适用于频繁插入和删除操作的场景。
示例:LinkedList linkedList = new LinkedList();

队列 (Queue)

先进先出 (FIFO) 的集合,适用于排队处理的场景。
示例:Queue queue = new Queue();

栈 (Stack)

后进先出 (LIFO) 的集合,适用于需要逆序处理的场景。
示例:Stack stack = new Stack();

字典 (Dictionary<TKey, TValue>)

键值对的集合,适用于快速查找值的场景。
示例:Dictionary<string, int> dictionary = new Dictionary<string, int>();

哈希集 (HashSet)

无序的唯一元素集合,适用于快速查找和唯一性判断的场景。
示例:HashSet hashSet = new HashSet();

排序字典 (SortedDictionary<TKey, TValue>)

键值对的集合,键按顺序排列,适用于需要有序访问的场景。
示例:SortedDictionary<string, int> sortedDictionary = new SortedDictionary<string, int>();

排序集 (SortedSet)

无序且唯一的元素集合,元素按顺序排列。
示例:SortedSet sortedSet = new SortedSet();

双端队列 (Deque)

既可以从两端插入和删除元素的集合。
示例:.NET Standard 库中没有直接的 Deque 实现,但可以使用 LinkedList 实现类似功能。