6.1. 结构体
凹语言中结构体声明的一般形式为:
type 类型名 struct {
成员列表
}
其中成员列表
的部分与变量声明格式一致,比如下例:
// 版权 @2023 凹语言 作者。保留所有权利。
type Info struct {
name: string
age: i32
}
func PrintInfo(i: Info) {
println("名字:", i.name, ",年龄:", i.age)
}
func main {
i: Info
i.name = "张三"
i.age = 35
PrintInfo(i) // 名字: 张三 ,年龄: 35
}
与很多语言类似,凹语言 使用选择操作符 .
访问结构体值的成员。另外需要特别注意的是,选择操作符 .
也可以用于访问结构体引用的成员,例如:
// 版权 @2023 凹语言 作者。保留所有权利。
type Info struct {
name: string
age: i32
}
func GetInfo() => *Info {
i: Info
i.name = "李四"
i.age = 42
return &i
}
func main {
j := GetInfo() // j 的类型是引用, *Info
println(j.name, j.age) // 李四 42
}
由此可见,无论是值还是引用,访问其成员的方式是一致的,这与 C 语言不同(C 语言使用 ->
访问结构体指针的成员)。
结构体的成员类型,不能包含结构体本身,因为这会引起无限嵌套;事实上任何会引起无限嵌套的结构体都是非法的,比如两个结构体互相包含对方。但是结构体中包含本类型的引用是合法的(因为引用的实质是指针),这种用法常用于创建链表结构,比如:
type Node struct {
data: i32
next: *Node
}
结构体字面值的例子如下:
// 版权 @2023 凹语言 作者。保留所有权利。
type Info struct {
name: string
age: i32
}
func main {
i := Info{name: "王五"}
println(j.name, j.age) // 王五 0
}
在声明结构体字面值时 {}
内为成员字面值列表,未列出的成员为 0 值。
如果结构体内的所有成员变量都可比(既该成员类型的变量间可执行 ==
操作),则该结构体的变量间也可比。在目前已介绍的数据类型中,切片是不可比类型,因此直接或间接包含切片的结构体均不可比。与其他类型的声明类似,结构体可在模块内的任意文件中声明,且无需“先声明再使用”。