类型声明
类型别名
使用 type NewType = ExistingType
创建类型别名,这是联合类型的特例。
枚举(Enums)
枚举是一组命名整型常量,默认从0开始递增:
enum Color as u8 {
red // 0
green // 1
blue // 2
}
特性:
- 支持显式赋值:
enum Grocery { apple; orange=5; pear }
- 可定义方法:
fn (c Cycle) next() Cycle {
match c { ... }
}
- 支持字符串/整型转换:
println(Cycle.from('two')!) // "two"
println(Cycle.one.str()) // "one"
枚举变量禁止直接运算,需显式转换为整型
函数类型
使用类型别名定义函数签名:
type Filter = fn (string) string
fn filter(s string, f Filter) string {
return f(s)
}
兼容函数自动匹配:
// 函数签名兼容即可使用
println(filter('hello', uppercase))
接口(Interfaces)
定义包含字段和方法的契约:
interface Speaker {
breed string
speak() string
}
实现规则:
- 需实现接口所有方法和字段
mut:
部分需可变接收者:
interface Bar {
mut:
write(string) string
}
// 需实现为:fn (mut s Type) write(a string) string
类型检查
if s is Dog { // 自动转换为具体类型
println(s.breed)
}
嵌入式接口
组合多个接口:
interface ReaderWriter {
Reader
Writer
}
联合类型(Sum types)
可容纳多种类型的值:
type World = Mars | Moon | Venus
world := World(Moon{})
println(world.type_name()) // "Moon"
递归结构示例(二叉树):
type Tree = Empty | Node
fn sum(tree Tree) f64 {
match tree {
Empty { 0 }
Node { tree.value + sum(tree.left) + sum(tree.right) }
}
}
动态转换
安全转换需结合智能转换:
if mut w is Mars { // 可变变量需mut
w.dust_storm() // 自动识别为Mars类型
}
选项/结果类型
错误处理核心机制:
// 结果类型(!)
fn find_user(id int) !User {
return error('Not found')
}
// 选项类型(?)
fn find_user(id int) ?User {
return none
}
处理方式:
- 错误传播:
resp := http.get(url)!
- 中断执行:
user := repo.find_user(7) or { return }
- 默认值:
b := do_something('bar') or { 'default' }
- if解包:
if resp := http.get(url) {
// 成功分支
} else {
println(err)
}
自定义错误类型
实现 IError
接口:
struct PathError {
Error // 嵌入默认实现
path string
}
fn (err PathError) msg() string {
return '路径错误: ${err.path}'
}
泛型(Generics)
类型参数化:
struct Repo[T] { db DB }
fn (r Repo[T]) find_by_id(id int) ?T {
table_name := T.name // 获取类型名
return r.db.query_one[T]('...', id)
}
// 使用
users_repo := new_repo[User](db)
user := users_repo.find_by_id(1)?
函数泛型:
fn compare[T](a T, b T) int {
if a < b { return -1 }
...
}
println(compare(1.1, 1.2)) // -1