本文目录一览:
- 如何用golang在mysql的表格创建自定义的字段
- golang map源码浅析
- (十一)golang 内存分析
- Golang 公共变量包——expvar
- golangmysql可扩展分表代码
- 知识分享之Golang——精选的组件库、组件列表,各种golang组件都可找到
如何用golang在mysql的表格创建自定义的字段
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// sql to create table
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";
if ($conn->query($sql) === TRUE) {
echo "Table MyGuests created successfully";
} else {
echo "Error creating table: " . $conn->error;
}
$conn->close();
golang map源码浅析
Go 中的 map
是通过 哈希表 + 链表 实现的。当发生哈希冲突时,使用拉链法生成节点。
[]bmap
是一个哈希表,每个bmap
被称为“桶”。- 一个
bmap
最多可以存放 8 个元素,超过后会生成新的节点并链接到当前桶的尾部。
bmap 的内存模型
- key 和 value 是分别存储的,而不是交替存储。
- 这样设计的好处是可以在某些情况下省略
padding
字段,节省内存空间。
map 的创建
通过调用 makemap
创建 map,它会初始化 hmap
中的字段,如设置 B
的大小和哈希种子。
makemap
返回的是*hmap
指针,说明 map 是引用类型,操作会影响结构体内部。
map 的 key 定位
- key 经过哈希计算后,得到 64 位的 hash 值。
- 后
B
位用于定位桶,高 8 位为tophash
。 - 定位过程是双重循环:外层遍历
overflow
链表,内层遍历当前bmap
中的 8 个元素。
扩容机制
- 当元素过多时,map 会扩容。
- 扩容分为等量扩容和双倍扩容。
- 双倍扩容后,旧桶中的元素会被分配到新桶的两个部分(高位和低位)。
(十一)golang 内存分析
Go 的内存分配器原理类似于 tcmalloc
,其核心思想是:
- 维护一块大的全局内存;
- 每个线程维护一块小的私有内存;
- 私有内存不足时再从全局申请。
内存区域划分
- spans:存放 span 的指针,每个指针对应一个 page;
- bitmap:用于垃圾回收;
- arena:堆区,应用程序的内存从这里分配。
内存管理结构
- span:管理一个或多个页;
- mcentral:全局资源,管理多个 span;
- mcache:线程私有资源,缓存 span;
- mheap:全局内存管理器。
内存分配策略
根据对象大小不同,分配策略也不同:
- Tiny 分配:小于 16B 且不包含指针的对象;
- 正常分配:16B 到 32KB 的对象;
- 大对象分配:大于 32KB 的对象。
Golang 公共变量包——expvar
expvar
是 Go 官方提供的公共变量包,用于调试全局变量,支持以下类型:
float64
int64
Map
String
特性
- 提供
/debug/vars
接口,可以查看所有注册的变量; - 适用于简单变量类型,如整型、字符串等。
golangmysql可扩展分表代码
go-mysql-server
是一个 SQL 引擎,支持解析标准 SQL(基于 MySQL 语法),并提供与 MySQL 协议兼容的服务器实现。
分库分表策略
- 垂直分库:将不同业务的数据放到不同的服务器中;
- 水平分表:将单表数据分散到多个物理节点中,解决单表数据量过大的问题。
知识分享之Golang——精选的组件库、组件列表,各种golang组件都可找到
awesome-go
是一个精选的 Go 框架、库和软件的汇总表,包含各种常用的 Go 组件。
用途
- 快速查找 Go 相关组件;
- 学习和使用 Go 的最佳实践;
- 适用于日常开发和项目构建。
如需了解更多 Go 相关内容,欢迎持续关注本系列文章。