最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年02月03日 14:00:14   作者:hezhiming  
這篇文章主要給大家介紹了關(guān)于Go語言 channel如何實(shí)現(xiàn)歸并排序中merge函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

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

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

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

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

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

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

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ì)列并無不同)
    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)
  }()
  // 開完goroutine后, 主線程繼續(xù)執(zhí)行, 不會阻塞
  return out
}

使用 Go 的感受

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

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

總結(jié)

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

相關(guān)文章

  • Go語言多值替換的HTML模板實(shí)例分析

    Go語言多值替換的HTML模板實(shí)例分析

    這篇文章主要介紹了Go語言多值替換的HTML模板,實(shí)例分析了Go語言多值替換與數(shù)組迭代的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語言使用scp的方法實(shí)例分析

    go語言使用scp的方法實(shí)例分析

    這篇文章主要介紹了go語言使用scp的方法,實(shí)例分析了go語言調(diào)用scp命令的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • golang slice元素去重操作

    golang slice元素去重操作

    這篇文章主要介紹了golang slice元素去重操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go?REST?API設(shè)計(jì)模式和反模式示例解析

    go?REST?API設(shè)計(jì)模式和反模式示例解析

    在這篇文章中,我們將探討一些常見的REST?API設(shè)計(jì)模式和開發(fā)者應(yīng)該注意的反模式,我們還將提供Golang和Open?API?Schema的代碼片段來幫助說明這些概念,有需要的朋友可以借鑒參考下
    2023-09-09
  • Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn)

    Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn)

    本文主要介紹了Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機(jī)會,在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來描述依賴的,可讀性非常好,而且與強(qiáng)大的?shell?結(jié)合在一起,基本可以實(shí)現(xiàn)任何想要的功能
    2023-01-01
  • go設(shè)置多個(gè)GOPATH的方式

    go設(shè)置多個(gè)GOPATH的方式

    這篇文章主要介紹了go設(shè)置多個(gè)GOPATH的方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go中的代碼換行問題

    Go中的代碼換行問題

    這篇文章主要介紹了Go中的代碼換行問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    匿名函數(shù)是不具名的函數(shù),可以在不定義函數(shù)名的情況下直接使用,通常用于函數(shù)內(nèi)部的局部作用域中,這篇文章主要介紹了golang的匿名函數(shù)和普通函數(shù)的區(qū)別,需要的朋友可以參考下
    2023-03-03
  • Go語言中常量定義方法實(shí)例分析

    Go語言中常量定義方法實(shí)例分析

    這篇文章主要介紹了Go語言中常量定義方法,以實(shí)例形式分析了Go語言中常量的定義及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評論

怀宁县| 鹿邑县| 东乡| 鸡泽县| 肃南| 昌平区| 孟津县| 杭锦后旗| 泾阳县| 丰都县| 中卫市| 洪泽县| 泰兴市| 上杭县| 萍乡市| 蒲城县| 周至县| 陆良县| 镇远县| 双峰县| 兴和县| 庄河市| 巴彦淖尔市| 扶余县| 宣汉县| 靖江市| 新津县| 祁连县| 长宁县| 中宁县| 黑山县| 云霄县| 兴安盟| 亳州市| 札达县| 安国市| 隆德县| 兖州市| 牙克石市| 三门峡市| 外汇|