跳转至

所有文章

Golang源码分析系列之Map底层实现

映射也被称为哈希表(hash table)、字典。它是一种由key-value组成的抽象数据结构。大多数情况下,它都能在O(1)的时间复杂度下实现增删改查功能。若在极端情况下出现所有key都发生哈希碰撞时则退回成链表形式,此时复杂度为O(N)。

映射底层一般都是由数组组成,该数组每个元素称为桶,它使用hash函数将key分配到不同桶中,若出现碰撞冲突时候,则采用链地址法(也称为拉链法)或者开放寻址法解决冲突。下图就是一个由姓名-号码构成的哈希表的结构图:

Go语言中映射中key若出现冲突碰撞时候,则采用链地址法解决,Go语言中映射具有以下特点:

  • 引用类型变量
  • 读写并发不安全
  • 遍历结果是随机的

数据结构

Go语言中映射的数据结构是runtime.hmap(runtime/map.go):

// A header for a Go map.
type hmap struct {
    count     int //  元素个数,用于len函数返回map元素数量
    flags     uint8 // 标志位,标志当前map正在写等状态
    B         uint8  // buckets个数的对数,即桶数量 = 2 ^ B
    noverflow uint16 // overflow桶数量的近似值,overflow桶即溢出桶,即链表法中存在链表上的桶的个数
    hash0     uint32 // 随机数种子,用于计算key的哈希值

    buckets    unsafe.Pointer // 指向buckets数组,如果元素个数为0时,该值为nil
    oldbuckets unsafe.Pointer // 扩容时指向旧的buckets
    nevacuate  uintptr        // 用于指示迁移进度,小于此值的桶已经迁移完成

    extra *mapextra // 额外记录overflow桶信息
}

pkg-config快速入门指南

pkg-config 是一个帮助开发人员在编译和链接程序时发现和使用库的辅助工具。它提供了一种方法来获取库的编译和链接参数,使得在编译时链接库变得更加容易和一致。pkg-config 通常用于Unix-like系统,并且支持多种编程语言。

pkg-config 的工作原理是查询一个名为.pc的文件,这些文件包含了关于库的元数据,例如库的安装位置、编译器标志、链接器标志等。当你安装一个库时,通常会在/usr/lib/pkgconfig/usr/share/pkgconfig目录下安装相应的.pc文件。

如何使用 pkg-config

查询库的编译和链接标志

使用pkg-config查询库的编译和链接标志是最常见的用途。例如,如果你想使用libopus库,你可以使用以下命令来获取编译和链接标志:

pkg-config --cflags --libs opus

这个命令会输出类似以下内容:

-I/usr/include/opus -lopus

这些标志可以直接在编译命令中使用。

uv 快速入门指南

uv 是一款由 Astral 团队(创始人 Charlie Marsh)使用 Rust 语言开发的高性能 Python 包管理器。它旨在解决传统工具如 pip 和 venv 在依赖解析、安装速度和整体效率上的瓶颈。

作为 Python 生态的现代化核心组件,uv 不仅提供数倍于 pip 的安装速度,还支持无缝兼容现有工具(如 pip、poetry 和 setuptools),让开发者能轻松过渡到高效的工作流。

无论你是初学者还是资深开发者,uv 都能简化项目管理、减少环境冲突,并加速开发迭代。

安装 uv

uv 的安装过程简单快捷,支持多种方式。推荐使用脚本安装,以获取最新版本和自动配置。

通过安装脚本

curl -LsSf https://astral.sh/uv/install.sh | sh

此命令会下载并执行安装脚本,将 uv 添加到你的 PATH 中。安装后,重启终端或运行 source ~/.bashrc(或对应 shell 配置)以生效。

Opus 音频编解码器:libopus API 实用指南

Opus 是一种高度高效的开源音频编解码器,由 IETF(互联网工程任务组)标准化开发。它以卓越的压缩效率、低延迟和高音质著称,尤其适合实时应用。Opus 支持宽带到全带宽的音频(6-20 kHz),并能无缝处理从语音到音乐的各种内容。libopus 是其核心 C 语言实现库,轻量级且跨平台,支持嵌入式设备到高性能服务器。

使用场景

Opus 在以下领域广泛应用:

  • 实时通信:如 VoIP(Voice over IP,例如 WebRTC 中的语音聊天)、视频会议和游戏内语音,确保低延迟传输。
  • 流媒体:在线音乐流、播客和视频平台(如 YouTube),平衡带宽与音质。
  • 存储与归档:音频文件压缩(如 Ogg Opus 容器),用于移动设备或云存储,节省空间。
  • 嵌入式系统:IoT 设备、智能音箱或无人机音频处理,支持 ARM 等架构。

与其他编解码器(如 AAC 或 MP3)相比,Opus 在低比特率下表现出色(例如 12-64 kbps),并内置前向纠错(FEC)和丢包隐藏机制,适合不稳定网络。

vcpkg快速入门指南

Vcpkg 是由 Microsoft 和 C++ 社区维护的免费开源 C/C++ 包管理器,可在 Windows、macOS 和 Linux 上运行。 它是核心的 C++ 工具,使用 C++ 和 CMake 脚本编写。 它旨在解决管理 C/C++ 库的独特难题。

为什么使用 vcpkg?

  • 在特选注册表中有超过2300 个开源库可供选择,这些库会定期生成,用于验证 ABI 兼容性
  • 支持使用自己的自定义库包创建自定义库注册表
  • 适用于 Windows、macOS 和 Linux 的一致的跨平台体验
  • 使用任何生成和项目系统都可以轻松将库添加到项目
  • 从源生成依赖项或下载预生成的 ABI 验证二进制文件,默认提供 70 多个配置,并可针对特定要求进行无限自定义
  • 通过独特的版本控制设计,防止依赖项之间出现版本冲突和菱形依赖问题
  • 对于 MSBuild 和 CMake 用户:自动与生成环境集成,打造无缝获取依赖项的体验

从零开始写一个哈希表

这篇笔记是对教程:write a hash table 的学习总结。该教程使用C语言,从零开始实现了一个哈希表,教程中哈希表实现使用了开放地址法双重哈希等技术。本篇笔记中部分内容对原教程进行了拓展。

什么是哈希表?

哈希表(Hash Table)是一种基于键值对(Key-Value)存储的高效数据结构,通过哈希函数(Hash Function)将键(Key)映射到数组的特定位置(桶),从而实现平均 O(1) 时间复杂度的插入、查找和删除操作。

下面是基于哈希表存储电话簿的结构图:

从ISO 639到BCP 47:语言码标准的发展与应用

随着全球化和信息化的快速发展,多语言环境成为不可或缺的一部分。在跨文化交流、软件国际化以及内容本地化的过程中,语言码作为语言标识的核心工具,扮演着至关重要的角色。本文将探讨语言码的主要标准,从早期的 ISO 639 到目前广泛应用的 BCP 47,了解其发展历程和应用场景。

什么是语言码?

语言码是一种用来标识自然语言的标准化代码,它提供了一种结构化的方式来表示语言、区域和书写系统。例如:

  • en 代表英语(English)。
  • zh-CN 代表简体中文(中国)。
  • fr-CA 代表加拿大法语。

通过语言码,系统可以识别用户的语言偏好,并相应地呈现内容。

音频编码知多少?

音频编码是指将声音信号(通常是模拟信号)转换为数字数据的一种技术和过程。音频编码通过一定的算法或格式,对声音信号进行数字化处理和压缩,生成适合存储、传输或播放的音频文件。编码的核心是减少音频文件的体积,同时尽可能保留原始声音的质量。

音频编码分为采样与量化以及数据压缩两大部分。采样与量化是将将连续的模拟声音信号转换为离散的数字信号(即数字化)。采样与量化具体过程包括:

  • 采样:按固定频率(采样率)对声音信号取样。
  • 量化:将采样值映射为有限范围的数字值,量化的精度由位深(Bit Depth)决定。

数据压缩是对数字化后的音频数据进行编码以减少文件大小。数据压缩分为:

  • 无损压缩:如 FLAC、ALAC,完全保留原始音频数据。
  • 有损压缩:如 MP3、AAC,牺牲部分音质以显著降低文件大小。

CMake快速上手指南

CMake是一个跨平台的自动化构建系统,它使用配置文件(CMakeLists.txt)来生成标准的构建文件,如Unix的Makefile或Windows的Visual Studio工程文件。CMake旨在支持多平台源代码编辑和管理,并且可以用于管理复杂项目和大型代码库的构建过程。

CMake的主要特点包括:

  1. 跨平台: 支持在多种操作系统上构建项目,包括Windows、Linux、macOS等。

  2. 生成构建系统: 根据CMakeLists.txt文件生成适用于不同平台的构建系统或IDE项目文件。

  3. 可扩展: 允许用户通过编写自己的CMake模块和脚本来扩展其功能。

  4. 查找依赖: 能够自动查找并配置项目所需的外部库和依赖项。

  5. 配置选项: 提供丰富的配置选项,允许用户自定义构建类型、编译选项等。

  6. 安装规则: 支持定义安装规则,方便软件的打包和分发。

  7. 集成测试: 支持集成测试,确保代码质量。

  8. 社区支持: 拥有一个活跃的社区和丰富的在线资源,包括文档、教程和论坛。

  9. 适用于大型项目: 特别适合于大型项目和多语言支持的项目。

CMake通过提供一套统一的构建和配置接口,简化了在不同平台上编译和构建项目的复杂性,是许多开源项目和商业软件所采用的构建工具之一。

成为一名优秀的程序员:心智模型和学习策略

前言

在我作为软件工程师的职业生涯中,我遇到了一些伟大的程序员,并从他们身上学到了很多东西。这篇文章将为初学者提供一些关于成为一名优秀程序员的旅程的提示,特别是从心智模型和学习策略方面。

掌握编程需要花费大量时间。 Peter Norvig 说十年可能就足够了,所以请保持耐心,让我们开始吧。

心智模型

每个人都会编程,几岁的孩子也能写出一些可运行的代码。然而,成为一名优秀的程序员需要大量的时间和精力来打磨技能。做好准备的心态会让你在这段漫长的旅程中不断成长。