rust-切片
20.Slice(切片)切片是只向一段连续内存的指针。在 Rust 中,连续内存够区间存储的数据结构:数组(array)、字符串(string)、向量(vector)。切片可以和它们一起使用,切片也使用数字索引访问数据。下标索引从0开始。slice 可以指向数组的一部分,越界的下标会引发致命错误(panic)。
切片是运行时才能确定的,并不像数组那样编译时就已经确定了。
切片的定义1let 切片值 = &变量[起始位置..结束位置]
[起始位置..结束位置],这是一个左闭右开的区间。
起始位置最小值是0。
结束位置是数组、向量、字符串的长度。
123456789101112fn main() { let mut v = Vec::new(); v.push("Go语言极简一本通"); v.push("Go语言微服务架构核心22讲"); v.push("从0到Go语言微服务架构师"); println!("len:{:?}",v.len()); ...
rust-借用
19.Borrowing 借用所有权生活中,我们对工具有所有权,但是也不妨碍我们可以把工具借给别人甚至租用给别人,别人用完了,要还给你的。
Rust 中,Borrowing(借用),就是一个函数中的变量传递给另外一个函数作为参数暂时使用。也会要求函数参数离开自己作用域的时候将所有权 还给当初传递给它的变量(好借好还,再借不难嘛!)。
1&变量名 //要把参数定义的时候这样定义。
例子如下:
123456789101112fn show(v:&Vec<&str>){ println!("v:{:?}",v)}fn main() { let studyList = vec!["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"]; let studyList2 =studyList; show2(&studyList2); println!(&quo ...
rust-所有权和移动
18.所有权因为变量要负责释放它们拥有的资源,所以资源只能拥有一个所有者。这也防止了资源的重复释放。注意并非所有变量都拥有资源(例如引用)。
在进行赋值(let a = b)或通过值来传递函数参数(foo(a))的时候,资源的所有权(ownership)会发生转移。按照 Rust 的规范,这被称为资源的移动(move)。
在移动资源之后,原来的所有者不能再被使用,这可避免悬挂指针(dangling pointer)的产生。
内存分为两大类:栈(stack) 和 堆(heap)
栈它是一种 后进先出 的机制,类似我们日常的落盘子,只能一个一个向上方,然后从最上面拿一个盘子。一个变量要放到栈上,那么它的大小在编译时就要明确。i32 类型的变量,它就占用 4 个字节。Rust 中可以放到栈上的数据类型,他们的大小都是固定的。如果是字符串,在运行时才会赋值的变量,在编译期的时候大小是未知或不确定的。所以字符串类型存储在堆上。
堆用于编译时大小未知或不确定的,只有运行时才能确定的数据。在堆上存储一些动态类型的数据。堆是不受系统管理的,是用户自己管理的,也增加了内存溢出的风险。
所有权所 ...
rust-数组
17.数组数组 是用来存储一系列数据,拥有相同类型 T 的对象的集合,在内存中是连续存储的。使用中括号 [] 来创建,且它们的大小在编译时会被确定。数组下标是从0 开始。数组是在栈中分配的,数组可以自动被借用成为 切片(slice)。
数组的声明和初始化12345678let 变量名:[数据类型;数组长度]=[值1,值2,值3,...];let arr1:[&str;3]=["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"];let 变量名=[值1,值2,值3,...];let arr2=["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"];let 变量名:[数据类型;数组长度]=[默认值,数组长度];let arr3:[&str;3]=["";3];
获取数组长度 len()1print!("{}",arr1. ...
rust-元组
16.元组(tuple)Tuple 元组是一个 复合类型 ,可以存储多个不同类型的数据。 Rust 支持元组 tuple 类型。元组使用括号 () 来构造(construct)。函数可以使用元组来返回多个值,因为元组可以拥有任意多个值。
元组一旦定义,就不能再增长或缩小,长度是固定的。元组的下标从 0 开始。
定义元组12let tuple变量名称:(数据类型1,数据类型2,...) = (数据1,数据2,...);let tuple变量名称 = (数据1,数据2,...);
** 注:tuple 使用一对小括号 () 把所有元素放在一起,元素之间使用逗号 , 分隔。如果显式指定了元组的数据类型,那么数据类型的个数必须和元组的个数相同,否则会报错。**
1234fn main() { let t:(&str,&str) = ("Go语言极简一本通","掌握Go语言语法,并且可以完成单体服务应用"); println!("{:?}",t);}
访问元素1元组 ...
rust-函数
15.函数函数是一组一起执行一个任务的语句块。每个 Rust 程序都至少有一个函数,即主函数 main()。划分的标准是每个函数执行一个单一的任务。这也是软件设计中经常说的 单一职责。这会让你的代码可读性更好。
函数的定义定义函数时必须以 fn 关键字开头,fn 关键字是 function 的缩写。
函数名称的命名规则和变量的命名规则一致。
123fn 函数名称([参数:数据类型]) -> 返回值 { // 函数代码}
参数用于将值传递给函数内部的语句。参数是可选的。
一个 “不” 返回值的函数。实际上会返回一个单元类型 ()。当函数返回 () 时,函数签名可以省略返回类型。
函数(function)使用 fn 关键字来声明。函数的参数需要标注类型,就和变量一样,如果函数返回一个值,返回类型必须在箭头 -> 之后指定。函数最后的表达式将作为返回值。也可以在函数内使用 return 语句来提前返一个值,甚至可以在循环或 if 内部使用。
123fn hello(){ println!("Hello, rust!&qu ...
rust-循环
14.循环现实中的循环很多,比如我们在学校操场里跑步,一圈一圈的跑。在计算机中,循环 其实就是一种重复,在满足指定的条件下,重复的做某些事情。
Rust 语言中也有三种表示 循环 的语句:
loop 语句。一种重复执行且永远不会结束的循环。
while 语句。一种在某些条件为真的情况下就会永远执行下去的循环。
for 语句。一种有确定次数的循环。
for 循环123for 临时变量 in 左区间..右区间 { // 执行业务逻辑}
左区间..右区间,这是一个左闭右开的区间,1..5,那就只包含 1,2,3,4
12345678for num in 1..5{ println!("num is {}", num);}//输出num is 1num is 2num is 3num is 4
可以使用 a..=b 表示两端都包含在内的范围。
123456789for num in 1..=5 { println!("num is {}" ...
rust-条件语句
13.条件判断
条件判断语句
说明
if 语句
if 语句用于模拟现实生活中的 如果…就…
if...else 语句
if...else 语句用于模拟 如果…就…否则…
else...if 和嵌套if 语句
嵌套if 语句用于模拟 如果…就…如果…就…
match 语句
match 语句用于模拟现实生活中的 老师点名 或 银行叫
if 语句123456789if 条件表达式 { // 条件表达式为true时要执行的逻辑}let total:f32=666.00;if total>500.00{ println!("打8折,{}",total*0.8)}//输出 打8折,532.8
if …else 语句12345678910111213if 条件表达式 { // 如果 条件表达式 为真则执行这里的代码} else { // 如果 条件表达式 为假则执行这里的代码}let total:f32=166.00;if tot ...
rust-运算符
12.运算符Rust 语言支持以下四种运算符
算术运算符
位运算符
关系运算符
逻辑运算符
算术运算符
名称
运算符
加
+
减
-
乘
*
除
/
求余
%
注:Rust 语言不支持自增自减运算符 ++ 和 --
关系运算符
名称
运算符
说明
大于
>
如果左操作数大于右操作数则返回 true 否则返回 false
小于
<
如果左操作数小于于右操作数则返回 true 否则返回 false
大于等于
>=
如果左操作数大于或等于右操作数则返回 true 否则返回 false
小于等于
<=
如果左操作数小于或等于右操作数则返回 true 否则返回 false
等于
==
如果左操作数等于右操作数则返回 true 否则返回 false
不等于
!=
如果左操作数不等于右操作数则返回 true 否则返回 false
逻辑运算符
名称
运算符
说明
逻辑与
&&
两边的条件表达式都为真则返回 true 否则 ...
rust-字符串
11.字符串Rust 语言提供了两种字符串
Rust 核心内置的数据类型&str,字符串字面量 。
Rust 标准库中的一个 公开 pub 结构体。字符串对象 String。
字面量&str字符串字面量的核心代码可以在模块 std::str 中找到。Rust 中的字符串字面量被称之为 字符串切片。因为它的底层实现是 切片。
1let lesson="Go语言微服务架构核心22讲";
字面量 &str 就是在 编译时 就知道其值的字符串类型,它也是字符的集合,被硬编码赋值给一个变量。
字符串字面量模式是 静态 的,所以,字符串字面量从创建时开始会一直保存到程序结束。
字符串对象字符串对象并不是 Rust 核心内置的数据类型,它只是标准库中的一个 公开 pub 的结构体。
1pub struct String
字符串对象是使用 UTF-8 作为底层数据编码格式,长度可变的集合。
字符串对象在 堆 heap 中分配,可以在运行时提供字符串值以及相应的操作方法。
新建字符串对象12String::new() //创建一个新的空字符串,它是静态 ...