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

简介: Rust vs Go:常用语法对比(三)(2)

51. Check if map contains key

Determine whether map m contains an entry for key k

检查map是否有某个key

package main
import (
  "fmt"
)
func main() {
  m := map[string]int{
    "uno":  1,
    "dos":  2,
    "tres": 3,
  }
  k := "cinco"
  _, ok := m[k]
  fmt.Printf("m contains key %q: %v\n", k, ok)
  k = "tres"
  _, ok = m[k]
  fmt.Printf("m contains key %q: %v\n", k, ok)
}

输出

m contains key "cinco": false
m contains key "tres": true
use std::collections::HashMap;
fn main() {
    let mut m = HashMap::new();
    m.insert(1, "a");
    m.insert(2, "b");
    let k = 2;
    let hit = m.contains_key(&k);
    println!("{:?}", hit);
}

52. Check if map contains value

检查map中是否有某个值

package main
import (
  "fmt"
)
func containsValue(m map[K]T, v T) bool {
  for _, x := range m {
    if x == v {
      return true
    }
  }
  return false
}
// Arbitrary types for K, T.
type K string
type T int
func main() {
  m := map[K]T{
    "uno":  1,
    "dos":  2,
    "tres": 3,
  }
  var v T = 5
  ok := containsValue(m, v)
  fmt.Printf("m contains value %d: %v\n", v, ok)
  v = 3
  ok = containsValue(m, v)
  fmt.Printf("m contains value %d: %v\n", v, ok)
}

输出

m contains value 5: false
m contains value 3: true
use std::collections::BTreeMap;
fn main() {
    let mut m = BTreeMap::new();
    m.insert(11, "one");
    m.insert(22, "twenty-two");
    {
        let v = "eight";
        let does_contain = m.values().any(|&val| *val == *v);
        println!("{:?}", does_contain);
    }
    {
        let v = "twenty-two";
        let does_contain = m.values().any(|&val| *val == *v);
        println!("{:?}", does_contain);
    }
}

53. Join a list of strings

字符串连接

package main
import (
  "fmt"
  "strings"
)
func main() {
  x := []string{"xxx", "bbb", "aaa"}
  y := strings.Join(x, "&")
  fmt.Println(y)
}

输出

xxx&bbb&aaa

关于 strings.Joins

fn main() {
    let x = vec!["Lorem", "ipsum", "dolor", "sit", "amet"];
    let y = x.join(", ");
    println!("{}", y);
}

输出

Lorem, ipsum, dolor, sit, amet

54. Compute sum of integers

计算整数之和

package main
import "fmt"
func main() {
  x := []int{1, 2, 3}
  s := 0
  for _, v := range x {
    s += v
  }
  fmt.Println(s)
}

输出

6

fn main() {
    let x: Vec<usize> = (0..=10_000).collect();
    eprintln!("Sum of 0-10,000 = {}", x.iter().sum::<usize>())
}

输出

Sum of 0-10,000 = 50005000


55. Convert integer to string

将整数转换为字符串

package main
import (
  "fmt"
  "strconv"
)
func main() {
  var i int = 1234
  s := strconv.Itoa(i)
  fmt.Println(s)
}

输出

1234

or

package main
import (
  "fmt"
  "strconv"
)
func main() {
  var i int64 = 1234
  s := strconv.FormatInt(i, 10)
  fmt.Println(s)
}

输出

1234

or

package main
import "fmt"
import "math/big"
func main() {
  var i int = 1234
  s := fmt.Sprintf("%d", i)
  fmt.Println(s)
  var j int = 5678
  s = fmt.Sprintf("%d", j)
  fmt.Println(s)
  var k *big.Int = big.NewInt(90123456)
  s = fmt.Sprintf("%d", k)
  fmt.Println(s)
}

输出

1234
5678
90123456
fn main() {
    let i = 123;
    let s = i.to_string();
    println!("{}", s);
}

输出

123

or

fn main() {
    let i = 123;
    let s = format!("{}", i);
    println!("{}", s);
}

输出

123


56. Launch 1000 parallel tasks and wait for completion

Fork-join : 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. Wait for the completion of the 1000 tasks and then print "Finished".

创建1000个并行任务,并等待其完成

package main
import (
  "fmt"
  "math/rand"
  "sync"
  "time"
)
func f(i int) {
  d := rand.Int() % 10000
  time.Sleep(time.Duration(d))
  fmt.Printf("Hello %v\n", i)
}
func main() {
  var wg sync.WaitGroup
  wg.Add(1000)
  for i := 1; i <= 1000; i++ {
    go func(i int) {
      f(i)
      wg.Done()
    }(i)
  }
  wg.Wait()
  fmt.Println("Finished")
}

输出

Hello 741
Hello 651
Hello 49
...(共计1000个)
Hello xxx
use std::thread;
fn f(i: i32) {
    i + 1;
}
fn main() {
    let threads: Vec<_> = (0..10).map(|i| thread::spawn(move || f(i))).collect();
    for t in threads {
      t.join();
    }
}

57. Filter list

Create list y containing items from list x satisfying predicate p. Respect original ordering. Don't modify x in-place.

过滤list中的值


package main
import "fmt"
type T int
func main() {
  x := []T{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  p := func(t T) bool { return t%2 == 0 }
  y := make([]T, 0, len(x))
  for _, v := range x {
    if p(v) {
      y = append(y, v)
    }
  }
  fmt.Println(y)
}

or

package main
import "fmt"
type T int
func main() {
  x := []T{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  p := func(t T) bool { return t%2 == 0 }
  n := 0
  for _, v := range x {
    if p(v) {
      n++
    }
  }
  y := make([]T, 0, n)
  for _, v := range x {
    if p(v) {
      y = append(y, v)
    }
  }
  fmt.Println(y)
}

输出

[2 4 6 8 10]
fn main() {
    let x = vec![1, 2, 3, 4, 5, 6];
    let y: Vec<_> = x.iter()
        .filter(|&x| x % 2 == 0)
        .collect();
    println!("{:?}", y);
}

输出

[2, 4, 6]

58. Extract file content to a string

提取字符串的文件内容

package main
import "fmt"
import "io/ioutil"
func main() {
  f := "data.txt"
  b, err := ioutil.ReadFile(f)
  if err != nil {
    panic(err)
  }
  lines := string(b)
  fmt.Println(lines)
}
// Create file in fake FS of the Playground. init is executed before main.
func init() {
  err := ioutil.WriteFile("data.txt", []byte(`Un
Dos
Tres`), 0644)
  if err != nil {
    panic(err)
  }
}

输出

Un
Dos
Tres
use std::fs::File;
use std::io::prelude::*;
fn main() -> Result<(), ()> {
    let f = "Cargo.toml";
    let mut file = File::open(f).expect("Can't open file.");
    let mut lines = String::new();
    file.read_to_string(&mut lines)
        .expect("Can't read file contents.");
    println!("{}", lines);
    Ok(())
}

or

use std::fs;
fn main() {
    let f = "Cargo.toml";
    let lines = fs::read_to_string(f).expect("Can't read file.");
    println!("{}", lines);
}

59. Write to standard error stream

Print the message "x is negative" to standard error (stderr), with integer x value substitution (e.g. "-2 is negative").

写入标准错误流

package main
import (
  "fmt"
  "os"
)
func main() {
  x := -2
  fmt.Fprintln(os.Stderr, x, "is negative")
}

输出

-2 is negative
fn main() {
    let x = -3;
    eprintln!("{} is negative", x);
}

输出

-3 is negative

60. Read command line argument

读取命令行参数

import "os"
x := os.Args[1]
use std::env;
fn main() {
    let first_arg = env::args().skip(1).next();
    let fallback = "".to_owned();
    let x = first_arg.unwrap_or(fallback);
    println!("{:?}", x);
}

输出

目录
相关文章
|
2天前
|
Rust 安全 编译器
30天拿下Rust之语法大全
Rust是一种系统级编程语言,以其独特的所有权系统和内存安全性受到开发者青睐。本文从基本数据类型入手,介绍了标量类型如整数、浮点数、布尔值及字符,复合类型如元组、数组和结构体等。此外,还探讨了变量与常量的声明与使用,条件判断与循环语句的语法,以及函数定义与调用的方法。文章通过示例代码展示了如何使用Rust编写简洁高效的程序,并简要介绍了注释与宏的概念,为读者快速掌握这门语言提供了实用指南。欲获取最新文章或交流技术问题,请关注微信公众号“希望睿智”。
|
2月前
|
存储 Java Go
|
1月前
|
Rust
Rust 中使用 :: 这种语法的几种情况
Rust 中使用 :: 这种语法的几种情况
|
2月前
|
Rust
Rust的if let语法:更简洁的模式匹配
Rust的if let语法:更简洁的模式匹配
9 0
|
2月前
|
编译器 Go 开发者
|
2月前
|
Go
go基础语法结束篇 ——函数与方法
go基础语法结束篇 ——函数与方法
|
2月前
|
编译器 Go 数据安全/隐私保护
go语言入门之路——基础语法
go语言入门之路——基础语法
|
2月前
|
存储 安全 Java
【Go语言精进之路】Go语言基础:基础语法概览
【Go语言精进之路】Go语言基础:基础语法概览
34 0
|
2月前
|
Java Go Scala
|
2月前
|
存储 Java Unix