青蛙小白
#Go

Go 1.15新特性学习笔记

Go 1.15继1.14 6个月后发布,主要是在工具链、运行时和类库上的改进,改版本继续保持对Go 1.x版本的兼容性。 Go 1.15值得关注的变化 Go 1.15中一些值得关注的地方: 对Go链接器的实质性改进 改进了对高核心计数的小对象的分配 X.509 CommonName弃用 GOPROXY支持跳过返回错误的代理 新增了一个time/tzdata包 核心库的一些改进 从这些变化上可以看出,这个版本变化不太大,其实在工具链和运行时上也不需要过多关注,直观的体验是编译的二进制文件大小确实比1.14小了一点点。

#Rust

rust语言基础学习: 并发中的原子操作和rus标准库中的原子类型

原子类型和原子操作 原子操作(atomic operation)是指不可分割且不可中断的一个或一系列操作,在并发编程中需要由CPU层面做出一些保证,让一系列操作成为原子操作。 一个原子操作从开始到结束可以是一个操作步骤,也可以包含多个操作步骤,这些步骤的顺序不可以被打乱,执行过程也不会被其他机制打断。

#Rust

rust语言基础学习: rust中的slice类型

今天来学习Rust中的slice类型。 为什么需要slice类型 为什么Rust会提供slice类型呢? Rust中的借用(Borrow语义)可以将一个值在其所有权不发生转移的情况下,借给其他变量使用,借用通过创建引用来实现,Rust中创建引用的行为被称为借用。 但对于常用的集合类型例如Vec<T>, String(String的底层是Vec<u8>),这些集合类型的引用类型&Vec<T>, &String,引用的将是整个集合的内容。

#Rust

rust语言基础学习: 使用ref关键字在模式匹配中通过引用进行绑定

今天来学习rust中的ref关键字。 由一个例子引出ref关键字的使用 先看下面的例子。 例1: #[derive(Debug)] enum HttpMethod { Get(Get), Post(Post), } #[derive(Debug)] struct Get { url: String, } #[derive(Debug)] struct Post { url: String, body: Vec<u8>, } fn main() { let method = HttpMethod::Get(Get{ url: String::from("https://google.com"), }); match method { HttpMethod::Get(get) => println!("send get reuqest: {:?}", get), HttpMethod::Post(post) => println!("send post reuqest: {:?}", post), } println!("{:?}", method); // 编译错误: borrow of partially moved value: `method` } 上面例1中在使用match表达式进行模式匹配时,在执行第25行或26行时method会发生部分移动(partially moved),根据rust所有权规则中的Move语义,method将失去所有权,因此在第29行无法再使用method变量,报了编译错误。

#Rust

rust语言基础学习: 内存相关的3个trait, Clone, Copy, Drop

昨天我们学习了AsRef和AsMut两个trait,使用这两个trait可以实现引用到引用的转换: 如果类型U实现了AsRef<T>,则as_ref可以实现&U到&T的转换 如果类型U实现了AsMut<T>,则as_ref可以实现从&U到&mut T的转换 如果T实现了AsRef<U>,那么&T就实现了AsRef<U> 如果T实现了AsRef<U>,那么&mut T就实现了AsRef<U> 如果T实现了AsMut<U>,那么&mut T就实现了AsMut<U> 到目前为止我们已经学习了Rust标准库中的11个常用的trait: