GO语言和C语法相似,但是屏蔽了C语言需要和操作系统打交道的复杂度,也就是说线程,锁,内存等东西都不需要GO开发者关心,用GO可以轻松写出高并发,多核并行的程序。
因此,GO开发对程序员的底层开发能力要求并不高,更容易推广和普及,非常适合PHP程序员来掌握,用于弥补PHP语言短板:不适合常驻服务,不适合海量并发,不适合并行计算,不适合复杂计算…总之,PHP语言是一门web脚本语言的定位是没有变过的。
学习GO语言只需要看官方教程即可:https://tour.go-zh.org/welcome/1,至于socket怎么用,file怎么读,其实完全依赖于你对这些操作系统以及底层开发的基础知识掌握程度,与GO语言本身并没有什么关系。
就学习GO本身来说,最重要的是掌握基础语法,掌握协程的原理和用法(包括锁),掌握管道,掌握多路select,理解如何利用数百万的协程+管道来编写并发的异步的程序,将你的固有编程思维转换到Goroutine的模型上来,才是最重要的。
最后学完教程,我也把最后一道练习题随便实现了一下,供参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
package main import ( "fmt" "sync" ) type Fetcher interface { // Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。 Fetch(url string) (body string, urls []string, err error) } func is_new_url(url string) bool { gLock.Lock() defer gLock.Unlock() _, ok := gUniq[url] if !ok { gUniq[url] = true } return !ok } // Crawl 使用 fetcher 从某个 URL 开始递归的爬取页面,直到达到最大深度。 func Crawl(url string, depth int, fetcher Fetcher, ch chan int) { // TODO: 并行的抓取 URL。 // TODO: 不重复抓取页面。 // 下面并没有实现上面两种情况: defer func() { if ch != nil { ch <- 1 } }() if (!is_new_url(url)) { fmt.Println("duplicate url: ", url) return } if depth <= 0 { return } body, urls, err := fetcher.Fetch(url) if err != nil { fmt.Println(err) return } fmt.Printf("found: %s %q\n", url, body) result_ch := make(chan int) for _, u := range urls { go Crawl(u, depth-1, fetcher, result_ch) } for i :=0;i<len(urls);i++ { <-result_ch } return } func main() { Crawl("http://golang.org/", 4, fetcher, nil) } // fakeFetcher 是返回若干结果的 Fetcher。 type fakeFetcher map[string]*fakeResult var gLock = sync.Mutex{} var gUniq = map[string]bool{} type fakeResult struct { body string urls []string } func (f fakeFetcher) Fetch(url string) (string, []string, error) { if res, ok := f[url]; ok { return res.body, res.urls, nil } return "", nil, fmt.Errorf("not found: %s", url) } // fetcher 是填充后的 fakeFetcher。 var fetcher = fakeFetcher{ "http://golang.org/": &fakeResult{ "The Go Programming Language", []string{ "http://golang.org/pkg/", "http://golang.org/cmd/", }, }, "http://golang.org/pkg/": &fakeResult{ "Packages", []string{ "http://golang.org/", "http://golang.org/cmd/", "http://golang.org/pkg/fmt/", "http://golang.org/pkg/os/", }, }, "http://golang.org/pkg/fmt/": &fakeResult{ "Package fmt", []string{ "http://golang.org/", "http://golang.org/pkg/", }, }, "http://golang.org/pkg/os/": &fakeResult{ "Package os", []string{ "http://golang.org/", "http://golang.org/pkg/", }, }, } |
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

php 是最好的语言
必须的
php是最好的语言