Rust vs Go:常用语法对比(二)


21. <font color="70d6ff">Swap values</font>

交换变量a和b的值

a, b = b, a
package main

import "fmt"

func main() {
    a := 3
    b := 10
    a, b = b, a
    fmt.Println(a)
    fmt.Println(b)
}
10
3

fn main() {
    let a = 3;
    let b = 10;

    let (a, b) = (b, a);

    println!("a: {a}, b: {b}", a=a, b=b);
}

输出

a: 10, b: 3

or

fn main() {
    let (a, b) = (12, 42);
    
    println!("a = {}, b = {}", a, b);
    
    let (a, b) = (b, a);
    
    println!("a = {}, b = {}", a, b);
}

输出

a = 12, b = 42
a = 42, b = 12


22. <font color="ff70a6">Convert string to integer</font>

将字符串转换为整型

import "strconv"
i, err  := strconv.Atoi(s) 
package main

import (
    "fmt"
    "reflect"
    "strconv"
)

func main() {
    // create a string
    s := "123"
    fmt.Println(s)
    fmt.Println("type:", reflect.TypeOf(s))

    // convert string to int
    i, err := strconv.Atoi(s)
    if err != nil {
        panic(err)
    }
    fmt.Println(i)
    fmt.Println("type:", reflect.TypeOf(i))
}
123
type: string
123
type: int

or

import "strconv"
i, err := strconv.ParseInt(s, 10, 0)
package main

import (
    "fmt"
    "reflect"
    "strconv"
)

func main() {
    s := "123"
    fmt.Println("s is", reflect.TypeOf(s), s)

    i, err := strconv.ParseInt(s, 10, 0)
    if err != nil {
        panic(err)
    }

    fmt.Println("i is", reflect.TypeOf(i), i)
}

s is string 123
i is int64 123

fn main() {
    // This prints 123
    let mut s = "123";
    let mut i = s.parse::<i32>().unwrap();
    println!("{:?}", i);

    // This panics
    s = "12u3";
    i = s.parse::<i32>().unwrap();
    println!("{:?}", i);
}

输出

123
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.

or

fn main() {
    let mut s = "123";
    let mut i: i32 = s.parse().unwrap_or(0);
    println!("{:?}", i);

    s = "12u3";
    i = s.parse().unwrap_or(0);
    println!("{:?}", i);
}

输出

123
0

or

fn main() {
    let mut s = "123";
    let mut i = match s.parse::<i32>() {
        Ok(i) => i,
        Err(_e) => -1,
    };
    println!("{:?}", i);

    s = "12u3";
    i = match s.parse::<i32>() {
        Ok(i) => i,
        Err(_e) => -1,
    };
    println!("{:?}", i);
}

输出

123
-1


23. <font color="ff9770">Convert real number to string with 2 decimal places</font>

Given a real number x, create its string representation s with 2 decimal digits following the dot.

给定一个实数,小数点后保留两位小数

package main

import "fmt"

func main() {
    x := 3.14159
    s := fmt.Sprintf("%.2f", x)
    fmt.Println(s)
}

输出

3.14


fn main() {
    let x = 42.1337;
    let s = format!("{:.2}", x);
    
    println!("{}", s);
}

输出

42.13


24. <font color="ffd670">Assign to string the japanese word ネコ</font>

Declare a new string s and initialize it with the literal value "ネコ" (which means "cat" in japanese)

声明一个新的字符串s,并用文字值“ネコ”初始化它(在日语中是“cat”的意思)

package main

import "fmt"

func main() {
    s := "ネコ"
    fmt.Println(s)
}


fn main() {
    let s = "ネコ";
    println!("{}", s);
}


25. <font color="e9ff70">Send a value to another thread</font>

Share the string value "Alan" with an existing running process which will then display "Hello, Alan"

将字符串值“Alan”与现有的正在运行的进程共享,该进程将显示“你好,Alan”

ch <- "Alan"
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)

    go func() {
        v := <-ch
        fmt.Printf("Hello, %v\n", v)
    }()

    ch <- "Alan"

    // Make sure the non-main goroutine had the chance to finish.
    time.Sleep(time.Second)
}

Hello, Alan

The receiver goroutine blocks reading the string channel ch.
The current goroutine sends the value to ch.
A goroutine is like a thread, but more lightweight.


use std::thread;
use std::sync::mpsc::channel;

fn main() {
    let (send, recv) = channel();

    let handle = thread::spawn(move || loop {
        let msg = recv.recv().unwrap();
        println!("Hello, {:?}", msg);
    });

    send.send("Alan").unwrap();
    
    handle.join().unwrap();
}

输出 Hello, "Alan"


26. <font color="386641">Create a 2-dimensional array</font>

Declare and initialize a matrix x having m rows and n columns, containing real numbers.

创建一个二维数组

声明并初始化一个有m行n列的矩阵x,包含实数。

const m, n = 3, 4
var x [m][n]float64
package main

import "fmt"

func main() {
    const m, n = 3, 4
    var x [m][n]float64

    x[1][2] = 8
    fmt.Println(x)
}

[[0 0 0 0] [0 0 8 0] [0 0 0 0]]

or

package main

import "fmt"

func main() {
    x := make2D(2, 3)

    x[1][1] = 8
    fmt.Println(x)
}

func make2D(m, n int) [][]float64 {
    buf := make([]float64, m*n)

    x := make([][]float64, m)
    for i := range x {
        x[i] = buf[:n:n]
        buf = buf[n:]
    }
    return x
}

[[0 0 0] [0 8 0]]


fn main() {
    const M: usize = 4;
    const N: usize = 6;

    let x = vec![vec![0.0f64; N]; M];
    
    println!("{:#?}", x);
}

输出

[
    [
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
    ],
    [
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
    ],
    [
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
    ],
    [
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
        0.0,
    ],
]
fn main() {
  const M: usize = 3;
  const N: usize = 4;

  let mut x = [[0.0; N] ; M];

  x[1][3] = 5.0;
  println!("{:#?}", x);
}

输出

[
    [
        0.0,
        0.0,
        0.0,
        0.0,
    ],
    [
        0.0,
        0.0,
        0.0,
        5.0,
    ],
    [
        0.0,
        0.0,
        0.0,
        0.0,
    ],
]


27. <font color="6a994e">Create a 3-dimensional array</font>

Declare and initialize a 3D array x, having dimensions boundaries m, n, p, and containing real numbers.

创建一个三维数组

声明并初始化一个三维数组x,它有m,n,p维边界,并且包含实数。

const m, n, p = 2, 2, 3
var x [m][n][p]float64
package main

import "fmt"

func main() {
    const m, n, p = 2, 2, 3
    var x [m][n][p]float64

    x[1][0][2] = 9

    // Value of x
    fmt.Println(x)

    // Type of x
    fmt.Printf("%T", x)
}
[[[0 0 0] [0 0 0]] [[0 0 9] [0 0 0]]]
[2][2][3]float64

or

func make3D(m, n, p int) [][][]float64 {
    buf := make([]float64, m*n*p)

    x := make([][][]float64, m)
    for i := range x {
        x[i] = make([][]float64, n)
        for j := range x[i] {
            x[i][j] = buf[:p:p]
            buf = buf[p:]
        }
    }
    return x
}
package main

import "fmt"

func main() {
    x := make3D(2, 2, 3)

    x[1][0][2] = 9
    fmt.Println(x)
}

func make3D(m, n, p int) [][][]float64 {
    buf := make([]float64, m*n*p)

    x := make([][][]float64, m)
    for i := range x {
        x[i] = make([][]float64, n)
        for j := range x[i] {
            x[i][j] = buf[:p:p]
            buf = buf[p:]
        }
    }
    return x
}
[[[0 0 0] [0 0 0]] [[0 0 9] [0 0 0]]]

fn main() {
    let m = 4;
    let n = 6;
    let p = 2;

    let x = vec![vec![vec![0.0f64; p]; n]; m];
    
    println!("{:#?}", x);
}

输出


[
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
]
fn main() {
    const M: usize = 4;
    const N: usize = 6;
    const P: usize = 2;

    let x = [[[0.0f64; P]; N]; M];

    println!("{:#?}", x);
}

输出

[
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
    [
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
        [
            0.0,
            0.0,
        ],
    ],
]


28. <font color="a7c957">Sort by a property</font>

Sort elements of array-like collection items in ascending order of x.p, where p is a field of the type Item of the objects in items.

按x->p的升序对类似数组的集合项的元素进行排序,其中p是项中对象的项类型的字段。

package main

import "fmt"
import "sort"

type Item struct {
    label string
    p     int
    lang  string
}

type ItemPSorter []Item

func (s ItemPSorter) Len() int           { return len(s) }
func (s ItemPSorter) Less(i, j int) bool { return s[i].p < s[j].p }
func (s ItemPSorter) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }

func sortItems(items []Item) {
    sorter := ItemPSorter(items)
    sort.Sort(sorter)
}

func main() {
    items := []Item{
        {"twelve", 12, "english"},
        {"six", 6, "english"},
        {"eleven", 11, "english"},
        {"zero", 0, "english"},
        {"two", 2, "english"},
    }
    fmt.Println("Unsorted: ", items)
    sortItems(items)
    fmt.Println("Sorted: ", items)
}

Unsorted:  [{twelve 12 english} {six 6 english} {eleven 11 english} {zero 0 english} {two 2 english}]
Sorted:  [{zero 0 english} {two 2 english} {six 6 english} {eleven 11 english} {twelve 12 english}]

or

package main

import "fmt"
import "sort"

type Item struct {
    label string
    p     int
    lang  string
}

func main() {
    items := []Item{
        {"twelve", 12, "english"},
        {"six", 6, "english"},
        {"eleven", 11, "english"},
        {"zero", 0, "english"},
        {"two", 2, "english"},
    }
    fmt.Println("Unsorted: ", items)

    less := func(i, j int) bool {
        return items[i].p < items[j].p
    }
    sort.Slice(items, less)

    fmt.Println("Sorted: ", items)
}

Unsorted:  [{twelve 12 english} {six 6 english} {eleven 11 english} {zero 0 english} {two 2 english}]
Sorted:  [{zero 0 english} {two 2 english} {six 6 english} {eleven 11 english} {twelve 12 english}]

#[derive(Debug)]
struct Foo {
    p: i32,
}

fn main() {
    let mut items = vec![Foo { p: 3 }, Foo { p: 1 }, Foo { p: 2 }, Foo { p: 4 }];

    items.sort_by(|a, b| a.p.cmp(&b.p));

    println!("{:?}", items);
}

输出

[Foo { p: 1 }, Foo { p: 2 }, Foo { p: 3 }, Foo { p: 4 }]

or

#[derive(Debug)]
struct Foo {
    p: i32,
}

fn main() {
    let mut items = vec![Foo { p: 3 }, Foo { p: 1 }, Foo { p: 2 }, Foo { p: 4 }];

    items.sort_by_key(|x| x.p);

    println!("{:?}", items);
}

输出

[Foo { p: 1 }, Foo { p: 2 }, Foo { p: 3 }, Foo { p: 4 }]


29. <font color="f2e8cf">Remove item from list, by its index</font>

Remove i-th item from list items.
This will alter the original list or return a new list, depending on which is more idiomatic.
Note that in most languages, the smallest valid value for i is 0.

从列表项中删除第I项。
这将改变原来的列表或返回一个新的列表,这取决于哪个更习惯。
请注意,在大多数语言中,I的最小有效值是0。

package main

import (
    "fmt"
)

func main() {
    items := []string{"a", "b", "c", "d", "e", "f"}
    fmt.Println(items)

    i := 2
    items = append(items[:i], items[i+1:]...)
    fmt.Println(items)
}
[a b c d e f]
[a b d e f]

or

copy(items[i:], items[i+1:])
items[len(items)-1] = nil
items = items[:len(items)-1]

fn main() {
    let mut v = vec![1, 2, 3];
    assert_eq!(v.remove(1), 2);
    assert_eq!(v, [1, 3]);
    
}


30. <font color="bc4749"> Parallelize execution of 1000 independent tasks</font>

Launch the concurrent execution of procedure f with parameter i from 1 to 1000.
Tasks are independent and f(i) doesn't return any value.
Tasks need not run all at the same time, so you may use a pool.

用参数I从1到1000启动程序f的并发执行。
任务是独立的,f(i)不返回值。
任务不需要同时运行,所以可以使用pools

import "sync"
wg := sync.WaitGroup{}
wg.Add(1000)
for i := 1; i <= 1000; i++ {
    go func(j int) {
          f(j)
          wg.Done()
        }(i)
}
wg.Wait()
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func f(i int) {
    d := rand.Int() % 10000
    time.Sleep(time.Duration(d))
    fmt.Printf("Hello %v\n", i)
}

func main() {
    for i := 1; i <= 1000; i++ {
        go f(i)
    }

    time.Sleep(4 * time.Second)
}


use std::thread;

fn main() {
    let threads: Vec<_> = (0..1000).map(|i| thread::spawn(move || f(i))).collect();

    for thread in threads {
        thread.join();
    }
}

fn f(i: i32) {
    println!("{}", i);
}

or

extern crate rayon;

use rayon::prelude::*;

fn main() {
    (0..1000).into_par_iter().for_each(f);
}

fn f(i: i32) {
    println!("{}", i);
}


31. <font color="001524">Recursive factorial (simple)</font>

Create recursive function f which returns the factorial of non-negative integer i, calculated from f(i-1)

创建递归函数f,该函数返回从f(i-1)计算的非负整数I的阶乘

func f(i int) int {
  if i == 0 {
    return 1
  }
  return i * f(i-1)
}
package main

import (
    "fmt"
)

func f(i int) int {
    if i == 0 {
        return 1
    }
    return i * f(i-1)
}

func main() {
    for i := 0; i <= 10; i++ {
        fmt.Printf("f(%d) = %d\n", i, f(i))
    }
}

输出

f(0) = 1
f(1) = 1
f(2) = 2
f(3) = 6
f(4) = 24
f(5) = 120
f(6) = 720
f(7) = 5040
f(8) = 40320
f(9) = 362880
f(10) = 3628800

fn f(n: u32) -> u32 {
    if n < 2 {
        1
    } else {
        n * f(n - 1)
    }
}

fn main() {
    println!("{}", f(4 as u32));
}

输出

24

or

fn factorial(num: u64) -> u64 {
    match num {
        0 | 1=> 1,
        _ => factorial(num - 1) * num,
    }
}

fn main (){
    println!("{}", factorial(0));
    println!("{}", factorial(1));
    println!("{}", factorial(2));
    println!("{}", factorial(3));
    println!("{}", factorial(4));
    println!("{}", factorial(5));
}

输出

1
1
2
6
24
120


32. <font color="15616d">Integer exponentiation by squaring</font>

Create function exp which calculates (fast) the value x power n.
x and n are non-negative integers.

创建函数exp,计算(快速)x次方n的值。
x和n是非负整数。

package main

import "fmt"

func exp(x, n int) int {
    switch {
    case n == 0:
        return 1
    case n == 1:
        return x
    case n%2 == 0:
        return exp(x*x, n/2)
    default:
        return x * exp(x*x, (n-1)/2)
    }
}

func main() {
    fmt.Println(exp(3, 5))
}

输出

243


fn exp(x: u64, n: u64) -> u64 {
    match n {
        0 => 1,
        1 => x,
        i if i % 2 == 0 => exp(x * x, n / 2),
        _ => x * exp(x * x, (n - 1) / 2),
    }
}

fn main() {
    let x = 16;
    let n = 4;
    
    println!("{}", exp(x, n));
}

输出

65536


33. <font color="ffecd1">Atomically read and update variable</font>

Assign variable x the new value f(x), making sure that no other thread may modify x between the read and the write.

为变量x分配新值f(x),确保在读和写之间没有其他线程可以修改x。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var lock sync.RWMutex
    x := 3

    lock.Lock()
    x = f(x)
    lock.Unlock()

    fmt.Println(x)
}

func f(i int) int {
    return 2 * i
}

6


use std::sync::Mutex;

fn f(x: i32) -> i32 {
    x + 1
}

fn main() {
    let x = Mutex::new(0);
    let mut x = x.lock().unwrap();
    *x = f(*x);
    
    println!("{:?}", *x);
}

输出

1


34. <font color="ff7d00">Create a set of objects</font>

Declare and initialize a set x containing objects of type T.

声明并初始化一个包含t类型对象的集合x。

x := make(map[T]bool)
package main

import "fmt"

type T string

func main() {
    // declare a Set (implemented as a map)
    x := make(map[T]bool)

    // add some elements
    x["A"] = true
    x["B"] = true
    x["B"] = true
    x["C"] = true
    x["D"] = true

    // remove an element
    delete(x, "C")

    for t, _ := range x {
        fmt.Printf("x contains element %v \n", t)
    }
}
x contains element D 
x contains element A 
x contains element B 

or

x := make(map[T]struct{})
package main

import "fmt"

type T string

func main() {
    // declare a Set (implemented as a map)
    x := make(map[T]struct{})

    // add some elements
    x["A"] = struct{}{}
    x["B"] = struct{}{}
    x["B"] = struct{}{}
    x["C"] = struct{}{}
    x["D"] = struct{}{}

    // remove an element
    delete(x, "C")

    for t, _ := range x {
        fmt.Printf("x contains element %v \n", t)
    }
}
x contains element B 
x contains element D 
x contains element A 

use std::collections::HashSet;

fn main() {
    let mut m = HashSet::new();
    m.insert("a");
    m.insert("b");

    println!("{:?}", m);
}

输出

{"a", "b"}


35. <font color="78290f">First-class function : compose</font>

Implement a function compose (A -> C) with parameters f (A -> B) and g (B -> C), which returns composition function g ∘ f

用参数f (A -> B)和g (B -> C)实现一个函数compose (A -> C),返回composition函数g ∘ f

package main

import "fmt"
import "strconv"

func compose(f func(A) B, g func(B) C) func(A) C {
    return func(x A) C {
        return g(f(x))
    }
}

func main() {
    squareFromStr := compose(str2int, square)
    fmt.Println(squareFromStr("12"))
}

type A string
type B int
type C int

func str2int(a A) B {
    b, _ := strconv.ParseInt(string(a), 10, 32)
    return B(b)
}

func square(b B) C {
    return C(b * b)
}

144


fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a>
    where F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C
{
    Box::new(move |x| g(f(x)))
}

or

fn compose<A, B, C>(f: impl Fn(A) -> B, g: impl Fn(B) -> C) -> impl Fn(A) -> C {
    move |x| g(f(x))
}

fn main() {
    let f = |x: u32| (x * 2) as i32;
    let g = |x: i32| (x + 1) as f32;
    let c = compose(f, g);
    
    println!("{}", c(2));
}

输出

5


36. <font color="ff9f1c">First-class function : generic composition</font>

Implement a function compose which returns composition function g ∘ f for any functions f and g having exactly 1 parameter.

实现一个函数组合,该函数组合为任何恰好有1个参数的函数f和g返回组合函数g ∘ f。

package main

import "fmt"

func composeIntFuncs(f func(int) int, g func(int) int) func(int) int {
    return func(x int) int {
        return g(f(x))
    }
}

func main() {
    double := func(x int) int {
        return 2 * x
    }
    addTwo := func(x int) int {
        return x + 2
    }
    h := composeIntFuncs(double, addTwo)

    for i := 0; i < 10; i++ {
        fmt.Println(i, h(i), addTwo(double(i)))
    }
}
0 2 2
1 4 4
2 6 6
3 8 8
4 10 10
5 12 12
6 14 14
7 16 16
8 18 18
9 20 20

fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a>
    where F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C
{
    Box::new(move |x| g(f(x)))
}

or

fn compose<A, B, C>(f: impl Fn(A) -> B, g: impl Fn(B) -> C) -> impl Fn(A) -> C {
    move |x| g(f(x))
}

fn main() {
    let f = |x: u32| (x * 2) as i32;
    let g = |x: i32| (x + 1) as f32;
    let c = compose(f, g);
    
    println!("{}", c(2));
}

输出

5


37. <font color="ffbf69">Currying</font>

Transform a function that takes multiple arguments into a function for which some of the arguments are preset.

将一个接受多个参数的函数转换为一个预设了某些参数的函数。

package main

import (
    "fmt"
    "time"
)

type Company string

type Employee struct {
    FirstName string
    LastName  string
}

func (e *Employee) String() string {
    return "<" + e.FirstName + " " + e.LastName + ">"
}

type Payroll struct {
    Company   Company
    Boss      *Employee
    Employee  *Employee
    StartDate time.Time
    EndDate   time.Time
    Amount    int
}

// Creates a blank payroll for a specific employee with specific boss in specific company
type PayFactory func(Company, *Employee, *Employee) Payroll

// Creates a blank payroll for a specific employee
type CustomPayFactory func(*Employee) Payroll

func CurryPayFactory(pf PayFactory, company Company, boss *Employee) CustomPayFactory {
    return func(e *Employee) Payroll {
        return pf(company, boss, e)
    }
}

func NewPay(company Company, boss *Employee, employee *Employee) Payroll {
    return Payroll{
        Company:  company,
        Boss:     boss,
        Employee: employee,
    }
}

func main() {
    me := Employee{"Jack", "Power"}

    // I happen to be head of the HR department of Richissim Inc.
    var myLittlePayFactory CustomPayFactory = CurryPayFactory(NewPay, "Richissim", &me)

    fmt.Println(myLittlePayFactory(&Employee{"Jean", "Dupont"}))
    fmt.Println(myLittlePayFactory(&Employee{"Antoine", "Pol"}))
}

{Richissim <Jack Power> <Jean Dupont> 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0}
{Richissim <Jack Power> <Antoine Pol> 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0}

fn add(a: u32, b: u32) -> u32 {
    a + b
}

fn main() {
    let add5 = move |x| add(5, x);

    let y = add5(12);
    println!("{}", y);
}

输出

17


38. <font color="cbf3f0">Extract a substring</font>

Find substring t consisting in characters i (included) to j (excluded) of string s.
Character indices start at 0 unless specified otherwise.
Make sure that multibyte characters are properly handled.

查找由字符串s的字符I(包括)到j(不包括)组成的子字符串t。
除非另有说明,字符索引从0开始。
确保正确处理多字节字符。

package main

import "fmt"

func main() {
    s := "hello, utf-8 문자들"
    i, j := 7, 15
    
    t := string([]rune(s)[i:j])
    
    fmt.Println(t)
}

utf-8 문자


extern crate unicode_segmentation;
use unicode_segmentation::UnicodeSegmentation;

fn main() {
    let s = "Lorem Ipsüm Dolor";
    let (i, j) = (6, 11);
    let t = s.graphemes(true).skip(i).take(j - i).collect::<String>();
    println!("{}", t);
}

输出

Ipsüm

or

use substring::Substring;
let t = s.substring(i, j);


39. <font color="2ec4b6">Check if string contains a word</font>

Set boolean ok to true if string word is contained in string s as a substring, or to false otherwise.

如果字符串单词作为子字符串包含在字符串s中,则将布尔ok设置为true,否则设置为false。

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := "Let's dance the macarena"

    word := "dance"
    ok := strings.Contains(s, word)
    fmt.Println(ok)

    word = "car"
    ok = strings.Contains(s, word)
    fmt.Println(ok)

    word = "duck"
    ok = strings.Contains(s, word)
    fmt.Println(ok)
}
true
true
false

fn main() {
    let s = "Let's dance the macarena";

    let word = "dance";
    let ok = s.contains(word);
    println!("{}", ok);

    let word = "car";
    let ok = s.contains(word);
    println!("{}", ok);

    let word = "duck";
    let ok = s.contains(word);
    println!("{}", ok);
}

输出

true
true
false


本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容