-
func?ReadSource(reader?io.Reader)?<-chan?int?{ ???out?:=?make(chan?int) ???go?func()?{ ??????buffer?:=?make([]byte,?8) ??????for??{ ?????????n,?err?:=?reader.Read(buffer) ?????????if?n?>?0?{ ????????????v?:=?int(binary.BigEndian.Uint64(buffer)) ????????????out?<-?v ?????????} ?????????if?err?!=?nil?{ ????????????break ?????????} ??????} ??????close(out) ???}() ???return?out } func?WriteSink(writer?io.Writer,?in?<-chan?int)??{ ???for?v?:=?range?in?{ ??????buffer?:=?make([]byte,?8) ??????binary.BigEndian.PutUint64(buffer,?uint64(v)) ??????writer.Write(buffer) ???} } func?RandomSource(count?int)?<-chan?int{ ???out?:=?make(chan?int) ???go?func()?{ ??????for?i?:=?0;?i?<?count;?i++?{ ?????????out?<-?rand.Int() ??????} ??????close(out) ???}() ???return?out }
func?main()?{ ???const?filename?=?"large.in" ???const?n?=?100000000 ???file,?err?:=?os.Create(filename) ???if?err?!=?nil?{ ??????panic(err) ???} ???defer?file.Close() ???p?:=?pipeline.RandomSource(n) ???writer?:=?bufio.NewWriter(file) ???pipeline.WriteSink(writer,?p) ???writer.Flush() ???file,?err?=?os.Open(filename) ???if?err?!=?nil?{ ??????panic(err) ???} ???defer?file.Close() ???p?=?pipeline.ReadSource(bufio.NewReader(file)) ???count?:=?0 ???for?v?:=?range?p?{ ??????fmt.Println(v) ??????count++ ??????if?count?>=?100?{ ?????????break ??????} ???} }
查看全部 -
package?pipeline import?( ???"encoding/binary" ???"io" ???"sort" ) func??ArraySource(a?...int)?<-chan?int?{ ???out?:=?make(chan?int) ???go?func()?{ ??????for?_,?v?:=?range?a{ ?????????out?<-?v ??????} ??????close(out) ???}() ???return?out } func?InMemSort(in?<-chan?int)?<-chan?int?{ ???out?:=?make(chan?int) ???go?func()?{ ??????//?Read?into?memory ??????var?a?[]int ??????for?v?:=?range?in?{ ?????????a?=?append(a,?v) ??????} ??????//?Sort ??????sort.Ints(a) ??????//?Output ??????for?_,?v?:=?range?a?{ ?????????out?<-?v ??????} ??????close(out) ???}() ???return?out } func?Merge(in1,?in2?<-chan?int)?<-chan?int?{ ???out?:=?make(chan?int) ???go?func()?{ ??????v1,?ok1?:=?<-in1 ??????v2,?ok2?:=?<-in2 ??????for?ok1?||?ok2?{ ?????????if?!ok2?||?(ok1?&&?v1?<=?v2)?{ ????????????out?<-?v1 ????????????v1,?ok1?=?<-in1 ?????????}?else?{ ????????????out?<-?v2 ????????????v2,?ok2?=?<-in2 ?????????} ??????} ??????close(out) ???}() ???return?out }
package?main import?( ???"ccmouse/gointro/pipeline" ???"fmt" ) func?main()?{ ???p?:=?pipeline.Merge( ??????pipeline.InMemSort( ?????????pipeline.ArraySource(3,?2,?6,?7,?4)), ??????pipeline.InMemSort( ?????????pipeline.ArraySource(7,?4,?0,?3,?2,?13,?8))) ???for?v?:=?range?p?{ ??????fmt.Println(v) ???} }
查看全部 -
一些節(jié)點(diǎn)
數(shù)組數(shù)據(jù)源節(jié)點(diǎn)- channel 的關(guān)閉及檢測
內(nèi)部排序節(jié)點(diǎn)
歸并節(jié)點(diǎn)
查看全部 -
外部排序 Pipeline
查看全部 -
節(jié)點(diǎn)的組裝
查看全部 -
節(jié)點(diǎn)多輸入和多輸出
查看全部 -
Pipeline
查看全部 -
外部排序歸并節(jié)點(diǎn)
查看全部 -
外部排序切分
查看全部 -
將數(shù)據(jù)分為左右兩半,分別歸并排序,再把兩個(gè)有序數(shù)據(jù)歸并
如何歸并:
[1, 3, 6, 7], [1, 2, 3, 5] → 1
[3, 6, 7],[1, 2, 3, 5] ? → 1
[3, 6, 7], [2, 3, 5] ? ? ? ?→ 2
[3,6,7],[3, 5] ? ? ? ? ? ?→?3
……
查看全部 -
package?main import?( ???"fmt" ???"sort" ) func?main()?{ ???//?create?a?slice?of?int ???a?:=?[]int{3,?6,?2,?1,?9,?10,8} ???sort.Ints(a) ???for?_,?v?:=?range?a?{ ??????fmt.Println(v) ???} }
查看全部 -
package?main import?( ???"fmt" ) func?main()?{ ???ch?:=?make(chan?string) ???for?i:=0;?i?<?5000;?i++?{ ??????//?go?starts?a?goroutine ??????go?printHelloWorld(i,?ch) ???} ???for??{ ??????msg?:=?<-?ch ??????fmt.Println(msg) ???} } func?printHelloWorld(i?int,?ch?chan?string)?{ ???for??{ ??????ch?<-?fmt.Sprintf("Hello?world?from?go?routine?%d!\n",?i) ???} }
查看全部 -
package?main import?( ???"fmt" ???"net/http" ) func?main()?{ ???http.HandleFunc("/",?func(writer?http.ResponseWriter,?request?*http.Request)?{ ??????fmt.Fprintf(writer,?"<h1>Hello?World?%s!<h1>",?request.FormValue("name")) ???}) ???http.ListenAndServe(":8888",?nil) }
查看全部 -
Hello World
普通 Hello World
Hello World Server - 讀取 url 中的參數(shù)
并發(fā) Hello World - 初識(shí) goroutine 與 channel
一個(gè)簡單的排序
查看全部 -
Hello World
普通 Hello World
Hello World Server - 讀取 url 中的參數(shù)
查看全部
舉報(bào)