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

前言

全州網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,全州網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為全州上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的全州做網(wǎng)站的公司定做!

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

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

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

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

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

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

由于我只是練手,所以我想到的 API 長這樣:

Merge(ch2, ch3): outChan

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

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

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

使用 Go 的感受

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。

當(dāng)前題目:Go語言channel如何實(shí)現(xiàn)歸并排序中的merge函數(shù)詳解
文章轉(zhuǎn)載:http://muchs.cn/article38/jpipsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、移動網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計、小程序開發(fā)、關(guān)鍵詞優(yōu)化網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)