国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

Go語言 channel如何實現歸并排序中的merge函數詳解

2020-04-01 18:59:10
字體:
來源:轉載
供稿:網友

前言

初識go語言不到半年,我是一次偶然的機會認識了golang這門語言,看到他簡潔的語法風格和強大的語言特性,瞬間有了學習他的興趣

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

實現過程

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

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

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

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

Merge(ch1, ch2): outChan

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

于是我的實現如下:

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

使用 Go 的感受

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灵山县| 新津县| 高雄市| 类乌齐县| 盐城市| 河南省| 饶阳县| 玛多县| 石屏县| 吴堡县| 滕州市| 县级市| 浏阳市| 大姚县| 弥勒县| 陆丰市| 华蓥市| 金阳县| 云南省| 深水埗区| 出国| 津南区| 巩义市| 安国市| 平凉市| 新蔡县| 天台县| 衡水市| 南阳市| 巨鹿县| 凌云县| 凉山| 芜湖县| 武胜县| 宜章县| 武胜县| 抚松县| 五寨县| 南岸区| 万安县| 灵台县|