欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang如何實(shí)現(xiàn)三元運(yùn)算符功能

 更新時間:2024年02月06日 08:52:47   作者:波羅學(xué)  
這篇文章主要介紹了在其他一些編程語言中,如?C?語言,三元運(yùn)算符是一種可以用一行代碼實(shí)現(xiàn)條件選擇的簡便方法,那么在Go語言中如何實(shí)現(xiàn)類似功能呢,下面就跟隨小編一起學(xué)習(xí)一下吧

今天來聊聊在 Go 語言中如何實(shí)現(xiàn)類似三元運(yùn)算符的功能。

首先,什么是三元運(yùn)算符?

在其他一些編程語言中,如 C 語言,三元運(yùn)算符是一種可以用一行代碼實(shí)現(xiàn)條件選擇的簡便方法。

x = condition ? a : b; // condition = true 則 x = a,否則 x = b

大道至簡的 Go 中肯定是沒有這個運(yùn)算符。

今天這篇文章將會就此展開,介紹 Go 中三元運(yùn)算符的一些實(shí)踐。

讓我們正式開始吧。

使用 if-else 語句

三元運(yùn)算符,本質(zhì)上其實(shí)就是 if-else 的簡化版本。通過 if-else 實(shí)現(xiàn)自然就是最常用的做法。

var x int
if condition {
    x = a
} else {
    x = b
}

非常簡單且易理解,無心智負(fù)擔(dān)。畢竟,這就應(yīng)該是它本來的樣子。

雖然這比三元運(yùn)算符要長一些,但它更容易理解,也是 Go 所推薦的方式。

一行表達(dá)式

三元運(yùn)算符之所以被人喜愛,我覺得重要的一個原因就是:它足夠簡潔。我們只要一行代碼就實(shí)現(xiàn)條件判斷。

在 Go 中,如果想在一行代碼實(shí)現(xiàn),可能嗎?

我們先來看看 rust 和 Python 是如何實(shí)現(xiàn)的。

如果了解 rust,你可能看過如下代碼。

let x = {
  if condition {
    a
  } else {
    b
  }
};

如上的代碼中,我們創(chuàng)建了一個代碼塊,它的最后一個表達(dá)式會作為 x 的值。這是 rust 所支持的語法。其實(shí)現(xiàn)代的不少語言支持這種簡約語法。

或者更簡潔下寫法也可以,如下:

let = if condition {a} else 

如果你了解 Python,你可能看到這樣的代碼。

x = a if condition else b

是不是更加簡潔。

Go 不支持這樣的語法,我們要實(shí)現(xiàn)類似效果,就只能通過立刻執(zhí)行的匿名函數(shù)實(shí)現(xiàn)。

代碼如下:

x := func() int {
  if condition {
     return a
  }
  return b
}()

算了,好丑,太麻煩了!

看起來還是 if-else 好用。但我還是不甘心,還是希望實(shí)現(xiàn)一行代碼的效果,怎么辦呢?

If 函數(shù)

前面的示例中,我們通過匿名函數(shù)實(shí)現(xiàn)類似于三元運(yùn)算符的功能。那不是說,預(yù)實(shí)現(xiàn)一個函數(shù)即可?

讓我們寫一個 If 的函數(shù)來模擬三元運(yùn)算符。這個函數(shù)接收一個布爾值和兩個可能的返回值。根據(jù)布爾值的真假,它返回其中一個值。

代碼如下所示:

func If(condition bool, a, b int) int {
    if condition {
        return a
    }
    return b
}

x := If(3 > 2, x1, x2)

現(xiàn)在的代碼是不是就清晰了許多呢?

但這種方法還是有個缺點(diǎn),就是針對不同的類型都要實(shí)現(xiàn)一個 If 函數(shù),如 IfInt()、IfString()IfFloat() 等等。

不過從 Go 1.18 開始,Go 成功引入泛型。

我們可以通過泛型擴(kuò)展一個更通用的 If 函數(shù),不僅僅適用于整數(shù),還可以用于其他類型。

示例代碼如下:

func If[T any](condition bool, a, b T) T {
    if condition {
        return a
    }
    return b
}

func main() {
    x := 10
    result := If(x > 0, "positive", "negative")
    fmt.Println(result) // 輸出 "positive"
}

當(dāng)然,我也不是建議這么用。既然官方不支持就算了吧,if-else 多寫幾行就多寫幾行吧。

奇淫巧技:基于 map

在網(wǎng)上,我還發(fā)現(xiàn)了一個奇淫巧技:基于 Map 模擬三元運(yùn)算法。

代碼如下:

x = map[string]int{
  true: b,
  false: c,
}[a]

基于 true 和 false 實(shí)現(xiàn)條件判斷。

這方法看起來挺有創(chuàng)意,但這其實(shí)會增加代碼的理解成本,降低可讀性。再者,這種方法的效率是沒有 if-else 的效率高的,因?yàn)樯婕暗搅?map 的算法實(shí)現(xiàn),沒有那么直接。

為什么 Go 沒有三元運(yùn)算符

你是否好奇,為什么 Go 語言沒有三元運(yùn)算符?

官方認(rèn)為三元運(yùn)算符有時會讓代碼變得復(fù)雜和難以理解。Go 鼓勵寫出更清晰直接的代碼。

一個 C 語言版本的復(fù)雜三元運(yùn)算符示例代碼:

#include <stdio.h>

int main() {
    int x = 5, y = 10, z = 15;
    char *result;

    result = x > y ? "X" : 
             y > z ? "Y" : 
             z > x ? "Z" : 
             x == y ? "X equals Y" : 
             y == z ? "Y equals Z" : 
             x == z ? "X equals Z" : 
             "All equal";

    printf("%s\n", result);
    return 0;
}

看這個代碼,頭暈沒?

我們看看摘自官方文檔的原文:

The reason ?: is absent from Go is that the language's designers had seen the operation used too often to create impenetrably complex expressions. The if-else form, although longer, is unquestionably clearer. A language needs only one conditional control flow construct.

翻譯內(nèi)容:

Go 語言中沒有 ?: 運(yùn)算符的原因是,該語言的設(shè)計者們觀察到這種運(yùn)算符過于頻繁地被用來創(chuàng)建難以理解的復(fù)雜表達(dá)式。盡管 if-else 形式更長,但它無疑更清晰。一種語言只需要一種條件控制流構(gòu)造。

從 rust 和 python 的決策上也可看出,這個觀點(diǎn)得到了很多人的認(rèn)同。但與 Go 不同的是,rust 和 python 雖然不支持傳統(tǒng)的三元運(yùn)算符,它們都提供了其他簡潔的寫法。

不禁思考:Go 強(qiáng)調(diào)大道至簡。但 rust 和 python 其實(shí)也挺簡單的,保留了三運(yùn)算法符簡潔性的優(yōu)點(diǎn)。

總結(jié)

本文介紹 Go 中三元運(yùn)算符的最佳實(shí)踐。我們通過 if-else 語句或立即執(zhí)行的匿名函數(shù)等方式來實(shí)現(xiàn)類似的功能。

除此以外,可以根據(jù)你的需要和你覺得哪種方法更容易理解來選擇使用。

以上就是golang如何實(shí)現(xiàn)三元運(yùn)算符功能的詳細(xì)內(nèi)容,更多關(guān)于go三元運(yùn)算符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    這是 2020 年第 3 個版本,也是最后一個版本,你還將發(fā)現(xiàn)許多新的代碼編輯功能,具體內(nèi)容詳情跟隨小編看看有哪些新特性
    2020-12-12
  • go實(shí)現(xiàn)Redis讀寫分離示例詳解

    go實(shí)現(xiàn)Redis讀寫分離示例詳解

    本篇文章將介紹Redis通信協(xié)議RESP,?而后在使用go來編寫一個中間件,從而來完成Redis讀寫分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 使用Golang簡單實(shí)現(xiàn)七牛圖片處理API

    使用Golang簡單實(shí)現(xiàn)七牛圖片處理API

    本文給大家實(shí)現(xiàn)的是使用Golang簡單實(shí)現(xiàn)七牛圖片處理API的方法和步驟,基于PIPE庫實(shí)現(xiàn)的,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-08-08
  • Golang中互斥鎖和讀寫互斥鎖原理及示例代碼

    Golang中互斥鎖和讀寫互斥鎖原理及示例代碼

    在Golang中,互斥鎖是一種基本的同步原語,用于實(shí)現(xiàn)對共享資源的互斥訪問,讀寫互斥鎖是一種特殊類型的互斥鎖,它允許多個協(xié)程同時讀取某個共享資源,本文將通過過示例代碼詳細(xì)介紹Golang中互斥鎖和讀寫互斥鎖,需要的朋友可以參考下
    2023-05-05
  • 一文詳解Golang如何解決內(nèi)存溢出

    一文詳解Golang如何解決內(nèi)存溢出

    內(nèi)存溢出是指程序在運(yùn)行時超出了分配給它的內(nèi)存限制,從而導(dǎo)致程序異常或崩潰的現(xiàn)象,本文主要為大家介紹了Golang解決內(nèi)存溢出的方法,感興趣的小伙伴可以了解下
    2025-01-01
  • 詳解Golang中g(shù)cache模塊的基本使用

    詳解Golang中g(shù)cache模塊的基本使用

    這篇文章主要通過結(jié)合商業(yè)項(xiàng)目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。使用gcache做緩存處理,簡單方便易上手
    2022-11-11
  • Goland中Protobuf的安裝、配置和使用

    Goland中Protobuf的安裝、配置和使用

    本文記錄了mac環(huán)境下protobuf的編譯安裝,并通過一個示例來演示proto自動生成go代碼,本文使用的mac?os?12.3系統(tǒng),不建議使用homebrew安裝,系統(tǒng)版本太高,會安裝報錯,所以自己下載新版壓縮包編譯構(gòu)建安裝
    2022-05-05
  • GO語言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼

    GO語言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼

    比特幣錢包實(shí)際上是一個密鑰對,當(dāng)你安裝 一個錢包應(yīng)用,或者是使用一個比特幣客戶端來生成一個新地址是,他就會為你生成一個密鑰對,今天通過本文給大家分享go語言遍歷錢包的相關(guān)知識,一起看看吧
    2021-05-05
  • Go語言使用Cobra實(shí)現(xiàn)強(qiáng)大命令行應(yīng)用

    Go語言使用Cobra實(shí)現(xiàn)強(qiáng)大命令行應(yīng)用

    Cobra是一個強(qiáng)大的開源工具,能夠幫助我們快速構(gòu)建出優(yōu)雅且功能豐富的命令行應(yīng)用,本文為大家介紹了如何使用Cobra打造強(qiáng)大命令行應(yīng)用,感興趣的小伙伴可以了解一下
    2023-07-07
  • 解決go獲取文件md5值不正確的問題

    解決go獲取文件md5值不正確的問題

    本文主要介紹了解決go獲取文件md5值不正確的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評論