成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go不能寫,但是可以用Rust寫的三段代碼!

開發 前端
Rust通過在編譯時而不是運行時檢測錯誤來確保可靠性,實現高性能,并且具有一定程度的表達性,使其可以編寫其他語言無法編寫的代碼。?

在這篇文章中,要分享的例子不僅僅是假設,它們來自于工作中的真實案例,在這些例子中,Go的局限性無法實現所需的解決方案。聲明:這里的區別并不在于Rust代碼比Go代碼更正確或更快。

1.讀取線程的ID

記錄當前線程的ID,或者在Go的情況下,記錄協程ID,是非常有用的。它明確了哪個線程正在做什么。如果沒有這些信息,每個線程的活動就會交織在一個日志文件中,因此很難跟蹤單個執行流。

在Rust中,獲取線程id就像這樣簡單:

let id = thread::current().id();

然而,Go并不公開協程id。Go故意不公開協程id,以阻止開發人員對線程本地存儲進行編程。對于想要理解日志的開發人員必須求助于其他方法來檢索該信息。

2.單個Select語句中的Case優先級排序

Go在select-case語句(等待多個通道操作)中隨機選擇所有就緒中的一個。如果準備好了多個case,并且希望在單個select語句中優先執行一個case,則不行。

在下面的代碼中,nReady1在統計上等于nReady2。

func main() {
    ready1 := make(chan struct{})
    close(ready1)
    ready2 := make(chan struct{})
    close(ready2)

    nReady1 := 0
    nReady2 := 0
    N := 10_000
    for i := 0; i < N; i++ {
        select {
        case <-ready1:
           nReady1++
        case <-ready2:
           nReady2++
        }
    }
    fmt.Println("nReady1:", nReady1)
    fmt.Println("nReady2:", nReady2)
}

執行結果:

nReady1: 4943
nReady2: 5057

必須使用嵌套的select語句(帶有默認值)來實現優先級。

select {
    case <-ready1:
       nReady1++
    default:
       select {
          case <-ready1:
             nReady1++
          case <-ready2:
             nReady2++
       }
}

然而,Rust的異步運行時Tokio允許在單個select語句中使用biased關鍵字設置優先級順序。

在下面的例子中,按照它們在代碼中出現的順序排列優先級。

use tokio::sync::mpsc;
use tokio::select;

#[tokio::main]
async fn main() {
    let (tx1, mut rx1) = mpsc::channel::<()>(1);
    drop(tx1);
    let (tx2, mut rx2) = mpsc::channel::<()>(1);
    drop(tx2);

    let mut n_ready1 = 0;
    let mut n_ready2 = 0;
    let n = 10_000;
    for _ in 0..n {
        select! {
            biased; // 按出現的順序優先處理已準備好的case
            _ = rx1.recv() => {
                n_ready1 += 1;
            },
            _ = rx2.recv() => {
                n_ready2 += 1;
            },
        }
    }

    println!("n_ready1: {}", n_ready1);
    println!("n_ready2: {}", n_ready2);
}

執行結果:

n_ready1: 10000
n_ready2: 0

Rust使用單個select語句實現了對case的優先級排序。

3.具有指針和值接收器的泛型類型

在Go中,你想為類型參數S定義一個類型約束,它實現了兩個方法:

type S struct{}

func (s S) M()  {}
func (s *S) P() {}

不幸的是,不可能用單個類型約束指定這兩個方法。必須使用兩個單獨的類型參數,每個類型參數都有自己的約束,然后將它們鏈接到函數f中。首先,定義T受Mer接口類型的約束。然后,將PT定義為受Per[T]接口類型約束,并引用第一個T。這看起來很復雜,并不直觀。

type Per[T any] interface {
    P()
    *T // 非接口類型約束元素
}

type Mer interface {
    M()
}

func f[T Mer, PT Per[T]](t T) {
    PT(&t).P()
    t.M()
}

在Rust中,解決方案很簡單。定義一個單獨的trait:MyTrait,然后將它用作f中的一個trait綁定。

trait MyTrait {
    fn M(&self);
    fn P(&mut self);
}

struct S;

impl MyTrait for S {
     fn M(&self) {}
    fn P(&mut self) {}
}

fn f<T: MyTrait>(t: &mut T) {
    t.M();
    t.P();
}

總結

Rust通過在編譯時而不是運行時檢測錯誤來確保可靠性,實現高性能,并且具有一定程度的表達性,使其可以編寫其他語言無法編寫的代碼。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2021-11-16 12:25:14

jsPPT前端

2024-06-12 08:00:07

2023-01-30 08:04:28

程序隱藏debug

2023-04-03 08:26:01

systemd運維

2023-06-19 14:14:24

Rust程序Web

2024-01-18 13:36:00

RustGo開發

2023-02-20 08:00:02

Rust語言系統

2011-12-26 09:34:26

2019-01-04 15:37:41

折疊手機小米手機

2018-07-31 10:20:54

WindowsDocker Linux

2010-03-04 16:33:21

Ubuntu cvs

2011-02-25 10:12:09

GoWeb

2023-03-10 08:48:29

2020-11-09 14:15:23

代碼菜鳥老司機

2012-03-19 15:44:39

代碼

2023-04-10 11:22:34

CIOIT運營成本

2011-01-04 14:27:50

安裝linux方法

2011-01-21 13:56:44

SendmailSolaris

2021-09-05 23:47:55

手機功能智能

2022-05-09 10:36:05

PythonPyScript開發者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线成人一区 | 国产99热在线| 精品亚洲一区二区 | 精品一区二区三区中文字幕 | 精品1区 | 日韩中文在线 | 久久99蜜桃综合影院免费观看 | 国产精品久久久久久久久久东京 | 不卡一区二区三区四区 | 久久精品综合 | aa级毛片毛片免费观看久 | 欧美精品乱码久久久久久按摩 | 成人精品一区二区三区 | 伊人久久国产 | 色婷婷亚洲国产女人的天堂 | 荷兰欧美一级毛片 | 97人人超碰 | 亚洲视频区 | 一区二区高清 | 精品国产一区一区二区三亚瑟 | 四虎影院久久 | 国产黄色大片网站 | 国内精品视频在线观看 | 国产高清精品一区二区三区 | 在线播放亚洲 | 国产免费黄网 | 久久综合九色综合欧美狠狠 | 久久久久久久国产 | 视频一区在线观看 | 国产精品色综合 | 精品国产乱码久久久久久影片 | 在线视频中文字幕 | 九九99精品 | 欧美三区在线观看 | 韩国av一区二区 | 婷婷国产一区 | 日韩在线视频精品 | 国产精品99久久久久久宅男 | 午夜看电影在线观看 | a毛片视频网站 | 黄色大片在线播放 |