结构体
声明
结构体用 jiegouti(结构体 / struct)声明,每个字段都必须写类型,可以带默认值:
cpro
jiegouti Person {
name leixing zifuchuan : "无名", // 默认值 "无名"
age leixing z64 : 18, // 默认值 18
money leixing z32, // 没有默认值
}cpro
结构体 Person {
name 类型 string : "无名", // 默认值 "无名"
age 类型 i64 : 18, // 默认值 18
money 类型 i32, // 没有默认值
}cpro
struct Person {
name type string : "无名", // 默认值 "无名"
age type i64 : 18, // 默认值 18
money type i32, // 没有默认值
}创建实例
创建时所有字段都必须有值:没有默认值的字段必须给出。
cpro
bl a leixing Person = { name: "张三", age: 20, money: 15 }
bl b leixing Person = { money: 17 } // ✓ name、age 用默认值
bl c leixing Person = { age: 20 } // ✗ money 没有值cpro
变量 a 类型 Person = { name: "张三", age: 20, money: 15 }
变量 b 类型 Person = { money: 17 } // ✓ name、age 用默认值
变量 c 类型 Person = { age: 20 } // ✗ money 没有值cpro
var a type Person = { name: "张三", age: 20, money: 15 }
var b type Person = { money: 17 } // ✓ name、age 用默认值
var c type Person = { age: 20 } // ✗ money 没有值字面量前面不写类型名。函数返回结构体时也一样:
cpro
jiegouti Vec {
x leixing z64,
y leixing z64,
}
hs make(a z64, b z64) Vec {
fanhui { x: a, y: b }
}cpro
结构体 Vec {
x 类型 i64,
y 类型 i64,
}
函数 make(a i64, b i64) Vec {
返回 { x: a, y: b }
}cpro
struct Vec {
x type i64,
y type i64,
}
fn make(a i64, b i64) Vec {
return { x: a, y: b }
}读写字段用 .:
cpro
a.age = 21
dayin(a.name, a.age)cpro
a.age = 21
打印(a.name, a.age)cpro
a.age = 21
print(a.name, a.age)每个实例都是独立的副本,var b = a 得到一份拷贝,改 b 不影响 a。
方法
用 shixian(实现 / impl)给结构体定义方法。冒号后面的名字(下例的 p)在方法里代表调用方法的那个实例:
cpro
jiegouti Person {
name leixing zifuchuan,
age leixing z64,
}
shixian Person:p {
hs set_age(v z64) kongbai {
p.age = v
}
hs older(n z64) z64 {
fanhui p.age + n
}
}
rukou() {
bl b leixing Person = { name: "张三", age: 18 }
b.set_age(30)
dayin(b.age) // 30
dayin(b.older(7)) // 37
}cpro
结构体 Person {
name 类型 string,
age 类型 i64,
}
实现 Person:p {
函数 set_age(v i64) void {
p.age = v
}
函数 older(n i64) i64 {
返回 p.age + n
}
}
入口() {
变量 b 类型 Person = { name: "张三", age: 18 }
b.set_age(30)
打印(b.age) // 30
打印(b.older(7)) // 37
}cpro
struct Person {
name type string,
age type i64,
}
impl Person:p {
fn set_age(v i64) void {
p.age = v
}
fn older(n i64) i64 {
return p.age + n
}
}
rukou() {
var b type Person = { name: "张三", age: 18 }
b.set_age(30)
print(b.age) // 30
print(b.older(7)) // 37
}p是实例本身,不是拷贝:方法里改字段,改的就是调用方的实例p只能读写字段,不能整体赋值(p = other报错)- 方法的返回类型同样不能省略
- 不同结构体的方法可以同名,也可以和普通函数同名
谁能调用方法
调用者必须是变量、结构体字段或数组元素,不能是临时值:
cpro
b.set_age(30) // ✓ 变量
box.owner.set_age(30) // ✓ 结构体字段
arr[i].set_age(30) // ✓ 数组元素
make().set_age(30) // ✗ 不能在临时值上调用方法cpro
b.set_age(30) // ✓ 变量
box.owner.set_age(30) // ✓ 结构体字段
arr[i].set_age(30) // ✓ 数组元素
make().set_age(30) // ✗ 不能在临时值上调用方法cpro
b.set_age(30) // ✓ 变量
box.owner.set_age(30) // ✓ 结构体字段
arr[i].set_age(30) // ✓ 数组元素
make().set_age(30) // ✗ 不能在临时值上调用方法只读变量不能调用方法(方法可能修改它),但可以读字段:
cpro
bl({ readonly: zheng }) c leixing Person = { name: "x", age: 1 }
c.set_age(9) // ✗ 只读变量不能调用方法
dayin(c.age) // ✓cpro
变量({ readonly: 真 }) c 类型 Person = { name: "x", age: 1 }
c.set_age(9) // ✗ 只读变量不能调用方法
打印(c.age) // ✓cpro
var({ readonly: true }) c type Person = { name: "x", age: 1 }
c.set_age(9) // ✗ 只读变量不能调用方法
print(c.age) // ✓匿名结构体
不需要复用的结构可以直接写成匿名结构体,冒号后面是值:
cpro
bl a = {
age leixing z64 : 18,
name leixing zifuchuan : "张三",
}
dayin(a.name)cpro
变量 a = {
age 类型 i64 : 18,
name 类型 string : "张三",
}
打印(a.name)cpro
var a = {
age type i64 : 18,
name type string : "张三",
}
print(a.name)匿名结构体不能定义方法。
不可拷贝结构体
包住文件句柄、网络连接这类资源的结构体,可以声明为不可拷贝,见 nocopy 结构体。
