使用 Rust 后,我寫 Go 的方法都變了!
大家好,我是漁夫。
今天跟大家分享,當(dāng)使用 Rust 一段時(shí)間后回來(lái)寫 Go 的有哪些變化。自己本身大部分工作上都是主要寫 Go 的,因?yàn)轫?xiàng)目原因,以及我自己本身對(duì) Rust 的熱愛(ài),業(yè)余時(shí)間也喜歡寫各種小工具等等,所以,也越來(lái)越習(xí)慣 Rust 的寫法。

錯(cuò)誤處理
以為我擺脫了 if err != nil { },在 Rust 中,很有可能會(huì)寫出類似 let result = some_function(),然后使用 match 或 ? 操作符來(lái)處理 Result。習(xí)慣使用 Rust 的寫法使用 ?, 模式匹配來(lái)處理錯(cuò)誤情況,用起來(lái)還是有點(diǎn)舒服滴。
let result = some_function()?;而 Go 呢,使用多返回值來(lái)處理錯(cuò)誤,通常是返回一個(gè)結(jié)果和一個(gè)錯(cuò)誤。
result, err := someFunction()
if err != nil {
// handle error
}Rust 錯(cuò)誤處理還是吸引很多開(kāi)發(fā)者的,很多其他語(yǔ)言開(kāi)發(fā)者,抱怨要是錯(cuò)誤處理像 Rust 那種多爽,Rust 的錯(cuò)誤處理機(jī)制也吸收了其他編程語(yǔ)言中錯(cuò)誤處理的優(yōu)點(diǎn),并結(jié)合了 Rust 獨(dú)特的語(yǔ)言特性,如強(qiáng)類型系統(tǒng)、模式匹配和所有權(quán)模型,形成了一套高效、安全且易于使用的錯(cuò)誤處理機(jī)制。
可以簡(jiǎn)單了解 Rust 錯(cuò)誤處理與其他語(yǔ)言的不同:
- 模式匹配與強(qiáng)類型系統(tǒng)(類似于 Haskell)
- 無(wú)異常設(shè)計(jì)(類似于 Go)
- 顯式錯(cuò)誤傳播(類似于 C++的 RAII)
- 可選值的處理(類似于 Swift 和 Kotlin),Rust 的 Option 類型類似于 Swift 的可選值(Optional)和 Kotlin 的可空類型(Nullable Type),用于處理可能為空的情況,這使得處理這類值更加安全和直觀。
容易把 … := 打成 let … =
有時(shí)候不自覺(jué)地將 Rust 的編程習(xí)慣和風(fēng)格帶入 Go 的編程中,使用 let 關(guān)鍵字代替 := , 在 Rust 中,變量通常是使用 let 關(guān)鍵字來(lái)聲明的。如:let x = 5。而在 Go 中,變量聲明和初始化通常使用 := 符號(hào),也很容易把錯(cuò)誤地在 Go 中使用如 let x := 5,而正確的方式是 x := 5。
容易寫循環(huán)時(shí)把 := range … 打成 in …
Rust 程序員在編寫 Go 代碼時(shí),也很容易在循環(huán)結(jié)構(gòu)中不自覺(jué)地將 Go 的 := range 語(yǔ)法寫成 Rust 風(fēng)格的 in。
Rust :
let numbers = vec![1, 2, 3, 4, 5];
for num in numbers {
println!("{}", num);
}Go :
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Println(index, value)
}函數(shù)定義關(guān)鍵字,容易把 func 寫成 fn
習(xí)慣了 Rust 后,切到寫 Go 代碼時(shí),可能會(huì)錯(cuò)誤地使用 fn 來(lái)定義函數(shù),也會(huì)習(xí)慣性的寫錯(cuò)。
Rust 的寫法:
fn add(a: i32, b: i32) -> i32 {
a + b
}Go 的寫法:
func add(a int, b int) int {
return a + b
}函數(shù)返回類型前,習(xí)慣加 ->
在 Rust 中,函數(shù)定義時(shí),返回類型是通過(guò) -> 符號(hào)指定的,緊跟在參數(shù)列表后面。
總是忘記 return
習(xí)慣性在函數(shù)中漏寫 return 語(yǔ)句,在 Rust 中,函數(shù)的最后一個(gè)表達(dá)式會(huì)自動(dòng)作為函數(shù)的返回值,除非它以分號(hào)結(jié)尾。因此,在 Rust 中編寫函數(shù)時(shí),經(jīng)常省略 return 關(guān)鍵字。
Rust 如下例子:
fn add(a: i32, b: i32) -> i32 {
a + b // 這個(gè)自動(dòng)返回 a + b 的結(jié)果
}Go 例子:
必須顯式使用 return
func add(a int, b int) int {
return a + b
}習(xí)慣使用劃線命名
在 Rust 開(kāi)發(fā)中,標(biāo)準(zhǔn)的變量和函數(shù)命名約定是使用下劃線分隔的小寫字母的,即所謂的 snake_case。
Rust:
fn demo_function() {
let local_variable = 100;
}Go:
func DemoFunction() {
localVariable := 100
}注意,Go 的首字母大小寫是有不同含義的。
好了,以上主要是分享當(dāng)寫 Rust 后,切到其他語(yǔ)言時(shí),通常習(xí)慣性使用 Rust 的寫法風(fēng)格。當(dāng)然有些沒(méi)有想到的,以上的習(xí)慣性,那種是你習(xí)慣性指數(shù)比較高的呢。學(xué)習(xí) Rust 建議初學(xué)者要適應(yīng)編譯告警一堆,還有跟編輯器做斗爭(zhēng)。

























