您的位置:首页 >Go 递归类型赋值原理与规则详解
发布于2026-04-13 阅读(0)
扫一扫,手机访问

Go 允许 n[0] = n 这类赋值,是因为 n[0] 的类型 N 与 n 的类型 []N 具有相同的底层类型 []N,且 []N 是未命名类型,满足 Go 类型可赋值性规则中的“相同底层类型 + 至少一方未命名”条件。
Go 允许 n[0] = n 这类赋值,是因为 n[0] 的类型 N 与 n 的类型 []N 具有相同的底层类型 []N,且 []N 是未命名类型,满足 Go 类型可赋值性规则中的“相同底层类型 + 至少一方未命名”条件。
在 Go 中,类型可赋值性(assignability)并非仅依赖表面名称是否一致,而是由底层类型(underlying type) 和命名状态(named vs. unnamed) 共同决定。关键规则来自 Go 语言规范 §Assignability:
A value x is assignable to a variable of type T if:
…
x’s type V and T have identical underlying types, and at least one of V or T is not a named type.
我们来逐层分析示例代码:
type N []N // 定义递归类型:N 的底层类型是 []N
func main() {
n := make([]N, 1) // n 的类型是 []N(未命名切片类型)
fmt.Printf("%T\n", n) // []main.N → 底层类型为 []N
fmt.Printf("%T\n", n[0]) // main.N → 底层类型也为 []N(根据规范:“the type to which N refers in its type declaration”)
n[0] = n // ✅ 合法:V = N, T = []N;二者底层类型均为 []N,且 T([]N)是未命名类型
}? 为什么 N 的底层类型是 []N?
根据 Go 规范对类型定义的说明:type N []N 表示 N 是 []N 的别名(type alias)式定义(注意:此处非 type alias 语法,而是传统类型定义,但效果等价于底层类型绑定)。因此 N 的底层类型即为其右侧的类型——[]N。而 []N 本身是复合字面类型,属于未命名类型(unnamed type)。
✅ 赋值成立的两个必要条件均满足:
⚠️ 重要注意事项:
? 总结:Go 的类型系统通过“底层类型一致性 + 命名松绑”设计,在保证类型安全的同时,为递归、泛型兼容及底层抽象提供了灵活性。理解 underlying type 与 named type 的区分,是掌握 Go 类型系统深层行为的关键。
上一篇:电脑桌面添加日历的简单方法
下一篇:MIUI11透明壁纸怎么开启
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9