主頁(yè) > 知識(shí)庫(kù) > Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解

Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解

熱門(mén)標(biāo)簽:建造者2地圖標(biāo)注 惠州電銷(xiāo)防封電話卡 濱州自動(dòng)電銷(xiāo)機(jī)器人排名 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 釘釘有地圖標(biāo)注功能嗎 阿里云ai電話機(jī)器人 汕頭小型外呼系統(tǒng) 黃岡人工智能電銷(xiāo)機(jī)器人哪個(gè)好 浙江高頻外呼系統(tǒng)多少錢(qián)一個(gè)月

前言

初識(shí)go語(yǔ)言不到半年,我是一次偶然的機(jī)會(huì)認(rèn)識(shí)了golang這門(mén)語(yǔ)言,看到他簡(jiǎn)潔的語(yǔ)法風(fēng)格和強(qiáng)大的語(yǔ)言特性,瞬間有了學(xué)習(xí)他的興趣

最近學(xué)習(xí) Go,但是苦于沒(méi)有項(xiàng)目練手,于是便逼迫自己:如果想到什么有趣的東西,看能不能用 Go 實(shí)現(xiàn)一遍,于是便有了這篇流水文。

實(shí)現(xiàn)過(guò)程

歸并排序中的 merge 函數(shù),相信每個(gè)人都很熟悉,網(wǎng)上隨便搜搜都有一大堆文章,這里不再贅述細(xì)節(jié)。一開(kāi)始,我用的是常規(guī)套路,不過(guò)覺(jué)得沒(méi)啥意思,無(wú)非是「換湯不換藥,感覺(jué)還是在拿自己熟悉的語(yǔ)言寫(xiě)東西」。

聯(lián)想到 Go 的 channel 似乎能在某種程度上滿足我的要求,再加上 Goroutine 這種東西,便想:是不是也能利用利用這兩個(gè)語(yǔ)言特性。

channel 這個(gè)數(shù)據(jù)結(jié)構(gòu),在 Go 中有比較豐富的含義,但我基本上把它當(dāng)隊(duì)列使用。Goroutine 也一樣,我基本把它等同于「用戶態(tài)線程」(兩者都很牛逼,不過(guò)作為應(yīng)用層的開(kāi)發(fā)者,有時(shí)候并不想深究太多,一切都往簡(jiǎn)單方向理解)。

由于我只是練手,所以我想到的 API 長(zhǎng)這樣:

Merge(ch1, ch2): outChan

給定兩個(gè)有序的 channel,然后將其合并為一個(gè)有序的 channel。

于是我的實(shí)現(xiàn)如下:

func Merge(ch1 -chan int, ch2 -chan int) -chan int {
  out := make(chan int)
  go func() {
    // 等上游的數(shù)據(jù) (這里有阻塞,和常規(guī)的阻塞隊(duì)列并無(wú)不同)
    v1, ok1 := -ch1
    v2, ok2 := -ch2
    // 取數(shù)據(jù)
    for ok1 || ok2 {
      if !ok2 || (ok1  v1 = v2) {
        // 取到最小值, 就推到 out 中
        out - v1
        v1, ok1 = -ch1
      } else {
        out - v2
        v2, ok2 = -ch2
      }
    }
    // 顯式關(guān)閉
    close(out)
  }()
  // 開(kāi)完goroutine后, 主線程繼續(xù)執(zhí)行, 不會(huì)阻塞
  return out
}

使用 Go 的感受

語(yǔ)法近乎簡(jiǎn)陋。不過(guò)對(duì)我而言并無(wú)大礙,反而喜歡。不太喜歡語(yǔ)法特性(語(yǔ)法糖)太多的語(yǔ)言,亂糟糟的,分散了太多注意力。要是每個(gè)語(yǔ)法特性都是相互正交的,我自然雙手贊同,但是如果多個(gè)特性都在做同一件事情,一般對(duì)學(xué)習(xí)者的負(fù)擔(dān)比較大的(Ruby),也不利于合作。

編譯型。不多講,幾乎已經(jīng)是俺學(xué)習(xí)新語(yǔ)言的必要條件了,前期開(kāi)發(fā)效率可能會(huì)慢點(diǎn),但是換來(lái)的是更少的 bug,尤其是對(duì)團(tuán)隊(duì)協(xié)作,可以減少很多痛苦。(要是你團(tuán)隊(duì)里面都是高手,用 Python 自然是爽歪歪,但是這一條件并不總是滿足。所以還是使用能編譯的語(yǔ)言吧 :))

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • C++歸并排序算法實(shí)例
  • C++實(shí)現(xiàn)的歸并排序算法詳解
  • c++歸并排序詳解
  • C++實(shí)現(xiàn)自底向上的歸并排序算法
  • C++實(shí)現(xiàn)自頂向下的歸并排序算法
  • C++實(shí)現(xiàn)歸并排序(MergeSort)
  • c++實(shí)現(xiàn)二路歸并排序的示例代碼
  • C++實(shí)現(xiàn)歸并排序算法
  • C++實(shí)現(xiàn)歸并排序
  • C++/GoLang如何實(shí)現(xiàn)自底向上的歸并排序

標(biāo)簽:東營(yíng) 昭通 泰安 阿壩 駐馬店 晉中 瀘州 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解》,本文關(guān)鍵詞  語(yǔ)言,channel,如何,實(shí)現(xiàn),歸并,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Go語(yǔ)言 channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章