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


alt

题图来自When to use Rust and when to use Go[1]


41. Reverse a string

反转字符串

package main

import "fmt"

func Reverse(s string) string {
 runes := []rune(s)
 for i, j := 0len(runes)-1; i < j; i, j = i+1, j-1 {
  runes[i], runes[j] = runes[j], runes[i]
 }
 return string(runes)
}

func main() {
 input := "The quick brown 狐 jumped over the lazy 犬"
 fmt.Println(Reverse(input))
 // Original string unaltered
 fmt.Println(input)
}

输出

犬 yzal eht revo depmuj 狐 nworb kciuq ehT
The quick brown 狐 jumped over the lazy 犬

let t = s.chars().rev().collect::<String>();

or

fn main() {
    let s = "lorém ipsüm dolör sit amor ❤ ";
    let t: String = s.chars().rev().collect();
    println!("{}", t);
}

输出

❤ roma tis rölod müspi mérol


42. Continue outer loop

Print each item v of list a which in not contained in list b. For this, write an outer loop to iterate on a and an inner loop to iterate on b.

打印列表a中不包含在列表b中的每个项目v。 为此,编写一个外部循环来迭代a,编写一个内部循环来迭代b。

package main

import "fmt"

func printSubtraction(a []int, b []int) {
mainloop:
 for _, v := range a {
  for _, w := range b {
   if v == w {
    continue mainloop
   }
  }
  fmt.Println(v)
 }
}

func main() {
 a := []int{1234}
 b := []int{2468}
 printSubtraction(a, b)
}

mainloop is a label used to refer to the outer loop.

输出

1
3

fn main() {
    let a = ['a''b''c''d''e'];
    let b = [     'b',      'd'     ];
    
    'outerfor va in &a {
        for vb in &b {
            if va == vb {
                continue 'outer;
            }
        }
        println!("{}", va);
    }
}

'outer is a label used to refer to the outer loop. Labels in Rust start with a '.

输出

a
c
e

43. Break outer loop

Look for a negative value v in 2D integer matrix m. Print it and stop searching.

在2D整数矩阵m中寻找一个负值v,打印出来,停止搜索。

package main

import "fmt"
import "os"

var m = [][]int{
 {123},
 {11030},
 {5-2055},
 {00-60},
}

func main() {
mainloop:
 for i, line := range m {
  fmt.Fprintln(os.Stderr, "Searching in line", i)
  for _, v := range line {
   if v < 0 {
    fmt.Println("Found ", v)
    break mainloop
   }
  }
 }

 fmt.Println("Done.")
}

mainloop is a label used to refer to the outer loop.

输出

Searching in line 0
Searching in line 1
Searching in line 2
Found  -20
Done.

fn main() {
    let m = vec![
        vec![123],
        vec![11030],
        vec![5, -2055],
        vec![00, -60],
    ];
    
    'outerfor v in m {
        'innerfor i in v {
            if i < 0 {
                println!("Found {}", i);
                break 'outer;
            }
        }
    }
}

Loop label syntax is similar to lifetimes.

输出

Found -20


44. Insert element in list

Insert element x at position i in list s. Further elements must be shifted to the right.

在列表s的位置I插入元素x。其他元素必须向右移动。

package main

import "fmt"

func main() {

 s := make([]int2)
 
 s[0] = 0
 s[1] = 2
 
 fmt.Println(s) 
 // insert one at index one
 s = append(s, 0)
 copy(s[2:], s[1:])
 s[1] = 1
 
 fmt.Println(s)
}

输出

[0 2]
[0 1 2]

fn main() {
    let mut vec = vec![123];
    vec.insert(14);
    assert_eq!(vec, [1423]);
    vec.insert(45);
    assert_eq!(vec, [14235]);
    
}

45. Pause execution for 5 seconds

在继续下一个指令之前,在当前线程中休眠5秒钟。

package main

import (
 "fmt"
 "time"
)

func main() {
 time.Sleep(5 * time.Second)
 fmt.Println("Done.")
}


use std::{thread, time};
thread::sleep(time::Duration::from_secs(5));

46. Extract beginning of string (prefix)

Create string t consisting of the 5 first characters of string s. Make sure that multibyte characters are properly handled.

创建由字符串s的前5个字符组成的字符串t。 确保正确处理多字节字符。

package main

import "fmt"

func main() {
 s := "Привет"
 t := string([]rune(s)[:5])
 
 fmt.Println(t)
}

输出

Приве

fn main() {
    let s = "été 😁 torride";
    
    let t = s.char_indices().nth(5).map_or(s, |(i, _)| &s[..i]);

    println!("{}", t);
}

输出

été 😁


47. Extract string suffix

Create string t consisting in the 5 last characters of string s. Make sure that multibyte characters are properly handled.

创建由字符串s的最后5个字符组成的字符串t。 确保正确处理多字节字符

package main

import "fmt"

func main() {
 s := "hello, world! 문자"
 t := string([]rune(s)[len([]rune(s))-5:])
 fmt.Println(t)
}

输出

d! 문자


fn main() {
    let s = "tükörfúrógép";
    let last5ch = s.chars().count() - 5;
    let s2: String = s.chars().skip(last5ch).collect();
    println!("{}", s2);
}

输出

rógép


48. Multi-line string literal

Assign to variable s a string literal consisting in several lines of text, including newlines.

给变量s赋值一个由几行文本组成的字符串,包括换行符。

package main

import (
 "fmt"
)

func main() {
 s := `Huey
Dewey
Louie`


 fmt.Println(s)
}

输出

Huey
Dewey
Louie

fn main() {
    let s = "line 1
line 2
line 3"
;
    
    print!("{}", &s);
}

输出

line 1
line 2
line 3

or

fn main() {
    let s = r#"Huey
Dewey
Louie"#
;
    
    print!("{}", &s);
}

输出

Huey
Dewey
Louie

49. Split a space-separated string

拆分用空格分隔的字符串

Build list chunks consisting in substrings of input string s, separated by one or more space characters.

构建由输入字符串的子字符串组成的列表块,由一个或多个空格字符分隔。

package main

import (
 "fmt"
 "strings"
)

func main() {
 s := "Un dos tres"
 chunks := strings.Split(s, " ")
 fmt.Println(len(chunks))
 fmt.Println(chunks)

 s = " Un dos tres "
 chunks = strings.Split(s, " ")
 fmt.Println(len(chunks))
 fmt.Println(chunks)

 s = "Un  dos"
 chunks = strings.Split(s, " ")
 fmt.Println(len(chunks))
 fmt.Println(chunks)
}

输出

3
[Un dos tres]
5
[ Un dos tres ]
3
[Un  dos]

or

package main

import (
 "fmt"
 "strings"
)

func main() {
 s := "hello world"
 chunks := strings.Fields(s)

 fmt.Println(chunks)
}

输出为

[hello world]

and

package main

import (
 "fmt"
 "strings"
)

func main() {
 s := "Un dos tres"
 chunks := strings.Fields(s)
 fmt.Println(len(chunks))
 fmt.Println(chunks)

 s = " Un dos tres "
 chunks = strings.Fields(s)
 fmt.Println(len(chunks))
 fmt.Println(chunks)

 s = "Un  dos"
 chunks = strings.Fields(s)
 fmt.Println(len(chunks))
 fmt.Println(chunks)
}

输出

3
[Un dos tres]
3
[Un dos tres]
2
[Un dos]

strings.Fields 就只能干这个事儿


fn main() {
    let s = "What a  mess";

    let chunks: Vec<_> = s.split_whitespace().collect();

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

输出

["What""a""mess"]

or

fn main() {
    let s = "What a  mess";

    let chunks: Vec<_> = s.split_ascii_whitespace().collect();

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

输出

["What""a""mess"]

or

fn main() {
    let s = "What a  mess";

    let chunks: Vec<_> = s.split(' ').collect();

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

输出

["What""a""""mess"]

50. Make an infinite loop

写一个无限循环

for {
 // Do something
}
package main

import "fmt"

func main() {
 k := 0
 for {
  fmt.Println("Hello, playground")
  k++
  if k == 5 {
   break
  }
 }
}

输出

Hello, playground
Hello, playground
Hello, playground
Hello, playground
Hello, playground

loop {
 // Do something
}

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 5false
m contains value 3true

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[2]


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{123}
 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{12345678910}
 p := func(t T) bool { return t%2 == 0 }

 y := make([]T, 0len(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{12345678910}
 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![123456];

    let y: Vec<_> = x.iter()
        .filter(|&x| x % 2 == 0)
        .collect();

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

输出

[246]

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);
}

输出

""


参考资料

[1]

When to use Rust and when to use Go: https://blog.logrocket.com/when-to-use-rust-when-to-use-golang/

[2]

strings.Joins: https://pkg.go.dev/strings#Join

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/43221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL应知应会】表分区(五)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 前言一、分区表1.非分区表2.分区…

【论文】基于GANs的图像文字擦除 ——2010.EraseNet: End-to-End Text Removal in the Wild(已开源)

pytorch官方代码&#xff1a;https://github.com/lcy0604/EraseNet 论文&#xff1a;2010.EraseNet: End-to-End Text Removal in the Wild 网盘提取码&#xff1a;0719 一、图片文字去除效果 图10 SCUT-EnsText 真实数据集的去除 第一列原图带文字、第二列为去除后的标签&a…

RocketMQ分布式事务 -> 最终一致性实现

文章目录 前言事务消息场景代码示例订单服务事务日志表TransactionMQProducerOrderTransactionListener业务实现类调用总结 积分服务积分记录表消费者启动消费者监听器增加积分幂等性消费消费异常 前言 分布式事务的问题常在业务与面试中被提及, 近日摸鱼看到这篇文章, 阐述的…

认识主被动无人机遥感数据、预处理无人机遥感数据、定量估算农林植被关键性状、期刊论文插图精细制作与Appdesigner应用开发

目录 第一章、认识主被动无人机遥感数据 第二章、预处理无人机遥感数据 第三章、定量估算农林植被关键性状 第四章、期刊论文插图精细制作与Appdesigner应用开发 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的…

Spring 能解决所有循环依赖吗?

以下内容基于 Spring6.0.4。 看了上篇文章的小伙伴&#xff0c;对于 Spring 解决循环依赖的思路应该有一个大致了解了&#xff0c;今天我们再来看一看&#xff0c;按照上篇文章介绍的思路&#xff0c;有哪些循环依赖 Spring 处理不了。 严格来说&#xff0c;其实也不是解决不了…

PoseiSwap 即将开启 POSE 单币质押,治理体系将全面运行

PoseiSwap 是目前行业首个将支持 RWA 资产交易的 DEX&#xff0c;其构建在 Nautilus Chain 上&#xff0c;并通过模块化的形式单独构建了 zk-Rollup 应用层&#xff0c;具备并行化运行、隐私特性&#xff0c;并从 Cosmos、Celestia、Eclipse 等 Layer0 设施中获得高度可组合性、…

MySQL 中NULL和空值的区别

MySQL 中NULL和空值的区别&#xff1f; 简介NULL也就是在字段中存储NULL值&#xff0c;空值也就是字段中存储空字符(’’)。区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0…

JDK、JRE、JVM三者之间的关系

总结 JDK包含JRE&#xff0c;JRE包含JVM。 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

21matlab数据分析牛顿插值(matlab程序)

1.简述 一、牛顿插值法原理 1.牛顿插值多项式   定义牛顿插值多项式为&#xff1a; N n ( x ) a 0 a 1 ( x − x 0 ) a 2 ( x − x 0 ) ( x − x 1 ) ⋯ a n ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 ) N_n\left(x\right)a_0a_1\left(x-x_0\right)a_2\left(x-x_0\…

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…

子网划分路由网卡安全组

1."IPv4 CIDR" "IPv4 CIDR" 是与互联网协议地址&#xff08;IP address&#xff09;和网络的子网划分有关的概念。 - "IPv4" 代表 "Internet Protocol version 4"&#xff0c;也就是第四版互联网协议&#xff0c;这是互联网上最广泛使…

谷歌插件(Chrome扩展) “Service Worker (无效)” 解决方法

问题描述&#xff1a; 写 background 文件的时候报错了&#xff0c;说 Service Worker 设置的 background 无效。 解决&#xff08;检查&#xff09;方法&#xff1a; 检查配置文件&#xff08;manifest.json&#xff09; 中的 manifest_version 是否为 3。 background 中的…

办公软件ppt的制作

毕业找工作太难了&#xff0c;赶紧多学点什么东西吧&#xff0c;今天开始办公软件ppt的制作学习。 本文以WPS作为默认办公软件&#xff0c;问为什么不是PowerPoint&#xff0c;问就是没钱买不起&#xff0c;绝对不是不会破解的原因。 一.认识软件 在快捷工具栏中顾名思义就是一…

6.4.2 互联网路由探测与发现基本原理

6.4.2 互联网路由探测与发现基本原理 一、路由探测与发现背后的协议工作过程 我们主要使用三种方法来实现路由探测与发现 基于IP的记录路由选项功能&#xff08;RR&#xff09;和ICMP功能的路由探测&#xff0c;典型的例子就是带有参数“r”的ping命令&#xff0c;即ping -r …

postgresql源码学习(58)—— 删除or重命名WAL日志?这是一个问题

最近因为WAL日志重命名踩到大坑&#xff0c;一直很纠结WAL日志在什么情况下会被删除&#xff0c;什么情况下会被重命名&#xff0c;钻研一下这个部分。 一、 准备工作 1. 主要函数调用栈 首先无用WAL日志的清理发生检查点执行时&#xff0c;检查点执行核心函数为CreateCheckPo…

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、补充说明四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、再输入4、再输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&…

Mysql基础(下)之函数,约束,多表查询,事务

&#x1f442; 回到夏天&#xff08;我多想回到那个夏天&#xff09; - 傲七爷/小田音乐社 - 单曲 - 网易云音乐 截图自 劈里啪啦 -- 黑马Mysql&#xff0c;仅学习使用 &#x1f447;原地址 47. 基础-多表查询-表子查询_哔哩哔哩_bilibili 目录 &#x1f982;函数 &#x1f3…

使用Plist编辑器——简单入门指南

本指南将介绍如何使用Plist编辑器。您将学习如何打开、编辑和保存plist文件&#xff0c;并了解plist文件的基本结构和用途。跟随这个简单的入门指南&#xff0c;您将掌握如何使用Plist编辑器轻松管理您的plist文件。 plist文件是一种常见的配置文件格式&#xff0c;用于存储应…

docker - prometheus+grafana监控与集成到spring boot 服务

一、Prometheus 介绍 1.数据收集器&#xff0c;它以配置的时间间隔定期通过HTTP提取指标数据。 2.一个时间序列数据库&#xff0c;用于存储所有指标数据。 3.一个简单的用户界面&#xff0c;您可以在其中可视化&#xff0c;查询和监视所有指标。二、Grafana 介绍 Grafana 是一…

Kubernetes对象深入学习之四:对象属性编码实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第四篇&#xff0c;前面咱们读源码和文档&#xff0c;从理论上学习了kubernetes的对象相关的知识&#xff…
最新文章