#1137 Golang 类型系统
Golang 2026-03-25看了这篇博客 Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!,讲的是 Go 语言规范中对 bool 类型定义的长期笔误被修正,其本质是内建类型(predeclared type)而非自定义类型(defined type)。
重新梳理一下我对 Golang 类型系统的一点认知。
-
从实现角度看,Go 类型系统可以抽象为三个核心维度:
- Type Identity(类型同一性):决定类型是否相等
- Underlying Type(底层类型):决定类型转换规则
- Assignability(可赋值性):决定类型之间是否可以直接使用
大多数类型问题,本质都是这三者的组合。
-
类型系统
Type ├── Named Type(命名类型) │ ├── Predeclared Type(内建类型) │ ├── Defined Type(通过 type 定义的新类型) │ └── Type Parameter(泛型参数) ├── Unnamed Type(Type Literal) └── Alias(类型别名,声明机制,不是类型分类)-
Named Type(命名类型)
- 具有类型标识(Type Identity)
- 类型相等 => 是否为同一 Type Identity(即同一声明)
- Defined Type 支持方法绑定(行为扩展)
- 用于语义建模
- 每个类型都有 underlying type,用于决定类型转换和兼容性
-
Unnamed Type(未命名类型,或者叫类型字面量 Type Lit),即 TypeLit,比如:
struct{}、[]T、map[K]V、func(int) string- 无类型名,仅结构定义
- 类型相等 => 结构一致(Structural Identity:字段、顺序、tag 等完全一致)
- 不支持方法绑定
- 用于数据组合
-
Alias
- 复用原类型的 Type Identify
- 不创建新类型,和原类型完全等价
- 不能绑定新的方法(Alias 不能作为 receiver,方法由原类型决定)
- 应用场景
- 包结构重构:旧包中给新包类型定义别名,可以不影响旧代码,也可以保障 API 兼容。
- 在对外暴露的包中定义别名,减少调用方包导入
-
#1136 美以—伊朗冲突扩大化风险
政治 2026-03-24#1135 Frappe Helpdesk
低代码 Frappe 2026-03-20#1134 生活费用估算
个人 2026-03-19抖音刷到一个人分享自己的基本消费清单,我来了兴趣,拟定了一个自己的版本,以及一个床车版本(假定开一个新能源汽车,就住在公司附近停车场):
| 项目 | 网络版本 | 自己预估 | 备注 | 床车版本 | 备注 |
|---|---|---|---|---|---|
| 居住 | - | 1200 | 房租、水电、天然气、物业费 | 200 | 健身房洗澡 |
| 理发 | 25 | 10 | 大概两个半月剪一次,每次 20~30 | 10 | - |
| 烟 | 450 | 0 | - | 0 | - |
| 汽车 | 600 | 300 | 交通费 | 900 | - |
| 三餐 | 1800 | 1200 | 每天 40 | 1200 | - |
| 零食水果 | 400 | 200 | 每周 50 | 200 | - |
| 买衣服 | 300 | 0 | - | 0 | - |
| 话费 | 80 | 90 | 包括宽带 | 90 | - |
| 其他 | 300 | 200 | 生活物资采买、医疗等 | 200 | - |
| 共计 | 3955 | 3200 | - | 2900 | - |
说明:
- 一个人生活的话,公共交通就挺好的,不需要车,没有停车、加油费用。
- 如果床车的话,需要考虑停车、充电、保险、保养、罚单等费用。
- 停车费用 300/月
- 充电费用 200/月
- 保险费用 200/月
- 保养费用 100/月
- 其他费用 100/月
#1133 欧洲火药桶-巴尔干问题
政治 历史 2026-03-16#1132 塔利班
政治 历史 2026-03-08#1131 伊朗
政治 历史 2026-03-07#1130 中东文明冲突的结构性根源:地缘政治、宗教与历史遗产
政治 文化 历史 宗教 2026-03-06#1129 Git 查看所有别名
Git 2026-03-01我安装系统的时候会一并安装 git、gitk、gitg、git-doc、git-extras。
git-extras 中就有 git alias 命令可以列出所有别名。
如果没有安装可以 git config -l | grep alias 查看。
今天在 30secondsofcode 上看到一个采用 sed 进一步加工的版本:
git config -l | grep alias | sed 's/^alias\.//g'
PS: 其实就是去掉 alias. 前缀。