Rust和golang之字符串
RustRust 的核心语言中只有一种字符串类型:str,字符串 slice,它通常以被借用的形式出现,&str。 字符串 slice:他们是一些储存在别处的 UTF-8 编码字符串数据的引用。 称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rust开发者 们谈到 Rust 的 “字符串”时,他们通常指的是 String 和字符串 slice &str类型,而不是其中一个。这一部分大部分是关于 String 的,不过这些类型在 Rust 标准库中都被广泛使用。String 和字符串 slice 都是 UTF-8 编码的。 赋值在《Rust程序设计语言》中变量与数据的交互的方式(一):移动使用了如下实例, fn main() {
println!("Hello,world!");
let s1 = String::from("hello");
let s2 = s1;
println!("{}",s2);
// println!("{}",s1);
// let s3 = s2.clone();
// println!("{}{}",s3,s2);
}
强调了Rust语言的特异点 error[E0382]: use of moved value: `s1`
--> src/main.rs:6:19
|
4 | let s2 = s1;
| -- value moved here
5 | println!("{}",s2);
6 | println!("{}",s1);
| ^^ value used here after move
|
= note: move occurs because `s1` has type `std::string::String`,which does not implement the `Copy` trait
这个操作被称为“移动”,而不是浅拷贝。 而对于整型这样的在编译时已知大小的类型被整个存储在栈上,所以旧的整型变量在重新赋值后依然可用。 取子串let s = String::from("kingeasternsun");
let firstname = &s[0..4];
let secondname = &s[4..];
println!("{}",firstname);
println!("{}",secondname);
使用..进行取子串的操作,需要注意的是由于String的移动特性,所以要在s前加&. 注意前面的警告,原因时我在代码里定义了一个Rectangle的结构体没有使用,Rust中如果定义了一个结构体但是没有使用会报警告,结构体后续会详细介绍。 使用 push 附加字符串可以通过 push_str 方法来附加字符串 slice,从而使 String 变长: let mut s = String::from("foo");
s.push_str("bar");
执行这两行代码之后 s 将会包含 “foobar”。push_str 方法获取字符串 slice,因为并不需要获取参数的所有权。例如,如果将 s2 的内容附加到 s1 中后自身不能被使用就糟糕了: let mut s1 = String::from("foo");
let s2 = String::from("bar");
s1.push_str(&s2);
push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中: let mut s = String::from("lo");
s.push('l');
执行这些代码之后,s 将会包含 “lol”。 使用 + 运算符或 format! 宏级联字符串 let s1 = String::from("Hello,");
let s2 = String::from("world!");
let s3 = s1 + &s2; // Note that s1 has been moved here and can no longer be used
执行完这些代码之后字符串 s3 将会包含 Hello,world!。 字符串遍历如果你需要操作单独的 Unicode 标量值,最好的选择是使用 chars 方法。对 “??????” 调用 chars 方法会将其分开并返回六个 char 类型的值,接着就可以遍历结果来访问每一个元素了: for c in "??????".chars() {
println!("{}",c);
}
这些代码会打印出如下内容: ? ? ? ? ? ? bytes 方法返回每一个原始字节,这可能会适合你的使用场景: for b in "??????".bytes() {
println!("{}",b);
}
这些代码会打印出组成 String 的 18 个字节,开头是这样的: 224
164
168
224
// ... etc
不过请记住有效的 Unicode 标量值可能会由不止一个字节组成。 更加详细的参见 golang赋值在golang中,string是一连串不可更改的byte的集合。对于文本字符串在golang中是把文本Unicode code points(runes)转为UTF-8编码格式的byte列表。 s := "hello,kingeastern"
fmt.Println(s[0]) //打印104 对应字符'h'的byte的数值
s[0] = '3'
取子串s := "http://blog.csdn.net/wdy_yx"
fmt.Println(s[0]) //打印104 对应字符'h'的byte的数值
// s[0] = '3'
fmt.Println(s[:4])
fmt.Println(s[7:])
拼接直接使用”+”就可以实现字符串的拼接 s := "http://blog.csdn.net/wdy_yx"
fmt.Println(s[0]) //打印104 对应字符'h'的byte的数值
// s[0] = '3'
fmt.Println(s[:4])
fmt.Println(s[7:])
fmt.Println("this is my websit:" + s)
前面讲过golang里面string类型里面的内容是不可变的,那为什么还可以执行拼接操作呢? s := "http://blog.csdn.net/wdy_yx"
t := s
s += "this is my websit:"
fmt.Println(t)
fmt.Println(s)
代码如下: var buffer bytes.Buffer //Buffer是一个实现了读写方法的可变大小的字节缓冲
for {
//获取要增加的字符
buffer.WriteString(piece)
}
在golang的string中,可以插入任意的byte通过十六进制或8进制方式。 |