结构体( struct
)可以由各种不同类型组成。使用 struct 关键字来创建。struct 是 structure 的缩写。结构体可以作为另一个结构体的字段。结构体是可以嵌套的。
元组结构体(tuple struct),事实上就是具名元组而已。
代码语言:rust复制struct Pair(String, i32);
- 经典的 C 语言风格结构体(C struct)。
struct 结构体名称 {
...
}
- 单元结构体(unit struct),不带字段,在泛型中很有用。 struct Unit;
定义结构体
代码语言:txt复制struct 结构体名称 {
字段1:数据类型,
字段2:数据类型,
...
}
创建结构体实例
代码语言:txt复制let 实例名称 = 结构体名称{
field1:value1,
field2:value2
...
};
结构体初始化,其实就是对 结构体中的各个元素进行赋值。
代码语言:txt复制#[derive(Debug)]
struct Study {
name: String,
target: String,
spend: i32,
}
fn main() {
let s = Study {
name: String::from("从0到Go语言微服务架构师"),
target: String::from("全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。"),
spend: 3,
};
println!("{:?}", s);
//输出 Study { name: "从0到Go语言微服务架构师", target: "全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。", spend: 3 }
}
访问实例属性
代码语言:txt复制实例名称.属性
println!("{}",s.name);//输出 从0到Go语言微服务架构师
修改结构体实例
结构体实例默认是不可修改的,如果想修改结构体实例,声明时使用mut关键字。
代码语言:txt复制let mut s2 = Study {
name: String::from("从0到Go语言微服务架构师"),
target: String::from("全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。"),
spend: 3,
};
s2.spend=7;
println!("{:?}",s2);//输出 Study { name: "从0到Go语言微服务架构师", target: "全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。", spend: 7 }
结构体做参数
代码语言:txt复制fn show(s: Study) {
println!(
"name is :{} target is {} spend is{}",
s.name, s.target, s.spend
);
}
结构体作为返回值
代码语言:txt复制fn get_instance(name: String, target: String, spend: i32) -> Study {
return Study {
name,
target,
spend,
};
}
let s3 = get_instance(
String::from("Go语言极简一本通"),
String::from("学习Go语言语法,并且完成一个单体服务"),
5,
);
println!("{:?}", s3);
//输出 Study { name: "Go语言极简一本通", target: "学习Go语言语法,并且完成一个单体服务", spend: 5 }
方法
方法(method)是依附于对象的函数。这些方法通过关键字 self 来访问对象中的数据和其他。方法在 impl 代码块中定义。
代码语言:定义方法复制与函数的区别 函数:可以直接调用,同一个程序不能出现 2 个相同的函数签名的函数,应为函数不归属任何 owner。 方法:归属某一个 owner,不同的 owner 可以有相同的方法签名。
impl 结构体{
fn 方法名(&self,参数列表) 返回值 {
//方法体
}
}
impl 是 implement 的缩写。意思是 “实现”的意思。
self 是“自己”的意思,&self 表示当前结构体的实例。 &self 也是结构体普通方法固定的第一个参数,其他参数可选。
结构体方法的作用域仅限于结构体内部。
代码语言:txt复制impl Study {
fn get_spend(&self) -> i32 {
return self.spend;
}
}
println!("spend {}", s3.get_spend());
//输出 spend 5
结构体静态方法
代码语言:txt复制fn 方法名(参数: 数据类型,...) -> 返回值类型 {
// 方法体
}
调用方式
结构体名称::方法名(参数列表)
代码语言:txt复制impl Study {
...
fn get_instance_another(name: String, target: String, spend: i32) -> Study {
return Study {
name,
target,
spend,
};
}
}
let s4 = Study::get_instance_another(
String::from("Go语言极简一本通"),
String::from("学习Go语言语法,并且完成一个单体服务"),
5,
);
单元结构体
unit type 是一个类型,有且仅有一个值:(),单元类型()类似 c/c /java 语言中的 void。当一个函数并不需要返回值的时候,rust 则返回()。但语法层面上,void 仅仅只是一个类型,该类型没有任何值;而单元类型()既是一个类型,同时又是该类型的值。
实例化一个元组结构体
代码语言:txt复制 let pair = (String::from("从0到Go语言微服务架构师"), 1);
访问元组结构体的字段
代码语言:txt复制 println!("pair 包含 {:?} and {:?}", pair.0, pair.1);
解构一个元组结构体
代码语言:txt复制 let (study, spend) = pair;
println!("pair contains {:?} and {:?}", study, spend);