加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Rust和golang之字符串

发布时间:2020-12-16 19:07:11 所属栏目:大数据 来源:网络整理
导读:Rust 赋值 取子串 golang 赋值 取子串 拼接 UTF-8 Rust 赋值 在《Rust程序设计语言》中 变量与数据的交互的方式(一):移动 使用了如下实例, fn main ( ) { println!( "Hello,world!" ); let s1 = String::from( "hello" ); let s2 = s1; println!( "{}" ,
  • Rust
    • 赋值
    • 取子串
  • golang
    • 赋值
    • 取子串
    • 拼接
    • UTF-8

Rust

赋值

在《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语言的特异点
1. Rust认为s1不再有效,故执行s2=s1之后尝试获取s1的值会报错

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中如果定义了一个结构体但是没有使用会报警告,结构体后续会详细介绍。

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'

由于一个非ASCII编码的字符转为UTF-8格式后占用两个或更多的byte,所以string的第i个byte并不一定是string的第i个字符。

取子串

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:])


在golang中取子串的方式和大部分的编程语言一样使用:,同时在golang中如果定义一个结构体但是没有使用是没问题的,但是import一个库但是没有使用是会报错的。

拼接

直接使用”+”就可以实现字符串的拼接

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类型里面的内容是不可变的,那为什么还可以执行拼接操作呢?
其实执行拼接操作后,原先的string并没有改变,而是拼接后的新字符串在另外一块内存中,s指向了这部分新的内存,可以看下面的样例:

s := "http://blog.csdn.net/wdy_yx"
    t := s
    s += "this is my websit:"
    fmt.Println(t)
    fmt.Println(s)

如果要进行多次拼接操作,更加高效的方式时使用bytes.Buffer。

代码如下:

var buffer bytes.Buffer //Buffer是一个实现了读写方法的可变大小的字节缓冲
    for {
         //获取要增加的字符
            buffer.WriteString(piece)
    }

在golang的string中,可以插入任意的byte通过十六进制或8进制方式。
16进制方式xhh,x后面一定要跟两个数字h(0-9a-f)
8进制方式00,一定要有三个数字(0-7)

golang的字符串还有一种Raw string表示方式,用

``

而不是

""

包含字符。在Raw string中无需处理escape字符,引号里包含的字符是什么样的打印出来就是什么样子的,Raw string可以夸行。

s := `
    http://blog.csdn.net/wdy_yx
    this is my website
    this return n
    `
    fmt.Println(s)

Raw string的特性在处理正则表达式,HTML模板,JSON等非常方便。

UTF-8

在golang中所有字符都是utf-8编码的,某些字符可能占用多个byte,len函数返回的是byte个数,utf8.RuneCountInString返回的是rune个数。
所以len(s)返回12,utf8.RuneCountInString(s)返回8.

for range 遍历string时是按照rune为单位遍历的
所以for i,r := range s遍历得到了汉字

fmt.Printf(“% xn”,s) 按照byte进行打印
fmt.Printf(“% xn”,[]rune(s)) 按照rune进行打印

s := "hello 世界"
    fmt.Println(len(s))
    fmt.Println(utf8.RuneCountInString(s))

    for i,r := range s {
        fmt.Printf("%dt%qt%xn",i,r,r)
    }

    fmt.Println("****************")
    for i,r := range []byte(s) {
        fmt.Printf("%dt%qt%xn",r)
    }

    fmt.Printf("% xn",s)
    fmt.Printf("%xn",[]rune(s))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读