#1099 Golang 类型系统

2026-03-25

看了这篇博客 Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!,讲的是 Go 语言规范中对 bool 类型定义的长期笔误被修正,其本质是内建类型(predeclared type)而非自定义类型(defined type)。
重新梳理一下我对 Golang 类型系统的一点认知。

  1. 从实现角度看,Go 类型系统可以抽象为三个核心维度:

    • Type Identity(类型同一性):决定类型是否相等
    • Underlying Type(底层类型):决定类型转换规则
    • Assignability(可赋值性):决定类型之间是否可以直接使用

    大多数类型问题,本质都是这三者的组合。

  2. 类型系统

    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{}[]Tmap[K]Vfunc(int) string

      • 无类型名,仅结构定义
      • 类型相等 => 结构一致(Structural Identity:字段、顺序、tag 等完全一致)
      • 不支持方法绑定
      • 用于数据组合
    • Alias

      • 复用原类型的 Type Identify
      • 不创建新类型,和原类型完全等价
      • 不能绑定新的方法(Alias 不能作为 receiver,方法由原类型决定)
      • 应用场景
        • 包结构重构:旧包中给新包类型定义别名,可以不影响旧代码,也可以保障 API 兼容。
        • 在对外暴露的包中定义别名,减少调用方包导入

#1096 生活费用估算

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 -

说明:

  1. 一个人生活的话,公共交通就挺好的,不需要车,没有停车、加油费用。
  2. 如果床车的话,需要考虑停车、充电、保险、保养、罚单等费用。
    1. 停车费用 300/月
    2. 充电费用 200/月
    3. 保险费用 200/月
    4. 保养费用 100/月
    5. 其他费用 100/月