最近要學習一下分佈式文件系統,瞭解一下分佈式文件系統的容錯機制,就開啓了自學MIT 6.824 Distributed System Spring 2014課程。 java
之前在學校裏面聽過陳康老師講過幾節課,有一些印象,確實很難。原本覺得也是C或者C++實現的,萬萬沒想到的是,居然用高大上的Go語言重寫了分佈式文件系統的框架,python
這讓我等小菜只好膜拜,只好開始學習Go語言。(參考資料:http://golang.org/doc/)golang
- 學習記錄
http://tour.golang.org/ 一個練習教程,過一遍基本上Go編程有了初步的瞭解。 下一步須要深刻研究GOROUTINE的原理以及應用。編程
1) 變量聲明和初始化 ( 變量聲明 := ,var,以及struct、Arrays、slice、map、channels、mathod、interface)框架
var i, j int = 1, 2
var c, python, java = true, false, "no!" 分佈式
struct:函數
type Vertex struct {
X int
Y int
}oop
Arrays: var a [10]int學習
Slices: p := []int{2, 3, 5, 7, 11, 13}fetch
a := make([]int,5)
var m map[string]Vertex
m = make(map[string]Vertex]
var m = map[string]Vertex{
"Bell Labs": Vertex{
40.68433, -74.39967,
},
"Google": Vertex{
37.42202, -122.08408,
},
}
函數的聲明
func swap(x, y string) (string, string)
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
Function closures
method 和 interface 自由擴展
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Errors
type error interface {
Error() string
}
Channels
ch := make(chan int)
ch := make(chan int, 100)
Sends to a buffered channel block only when the buffer is full. Receives block when the buffer is empty.
相似於C中的Pipe,用來線程之間傳遞數據
2) 基本語法
GO中沒有while,用for來表示,如for i < 100 { }
switch 、 if 、 for
3) 練習題
Exercise: Maps
- package main
- import (
- "code.google.com/p/go-tour/wc"
- "strings"
- )
- func WordCount(s string) map[string]int {
- words := strings.Fields(s)
- mp := make(map[string]int)
- for _,word := range words {
- 10. mp[word] += 1
- }
- return mp
- }
- func main() {
- wc.Test(WordCount)
- }
Exercise: Fibonacci closure
- func fibonacci() func() int {
- a:=0
- b:=1
- count := 1
- res := func() int {
- if count==1 {
- count++
- return 1
- } else {
- c :=a + b
- a = b
- b = c
- return c
- }
- }
- return res
- }
- func main() {
- f := fibonacci()
- for i := 0; i < 10; i++ {
- fmt.Println(f())
- }
- }
Advanced Exercise: Complex cube roots
- func Cbrt(x complex128) complex128 {
- // var z, z1 complex64
- z := complex128(1)
- z1 := z - ((z*z*z - x) / (3*z*z))
- i := 1
- for z1!=x && i<10 {
- z1 = z1 - ((z1*z1*z1 - x) / (3*z1*z1))
- i++;
- }
- return z1
- }
- func main() {
- fmt.Println(Cbrt(2))
- } (須要把整數強行轉換成complex128,另外也能夠簡單化,直接用real取實數部分)
Exercise: Errors
- type ErrNegativeSqrt float64
- func (e ErrNegativeSqrt) Error() string {
- return fmt.Sprintf("cantnot Sqrt negative number:%v",float64(e))
-
- }
- func Sqrt(f float64) (float64, error) {
- if f < 0 {
- return 0,ErrNegativeSqrt(f);
- }
- z := f
- for i:=0;i<10;i++ {
- z = (z+f/z)/2;
- }
- return z, nil
- }
- Exercise: Rot13 Reader
- type rot13Reader struct {
- r io.Reader
- }
- func ( rs *rot13Reader) Read(p []byte) (n int, err error) {
- n,err = rs.r.Read(p)
- for i := 0; i < len(p); i++ {
- if (p[i] >= 'A' && p[i] < 'N') || (p[i] >='a' && p[i] < 'n') {
- p[i] += 13
- } else if (p[i] > 'M' && p[i] <= 'Z') || (p[i] > 'm' && p[i] <= 'z'){
- p[i] -= 13
- }
- }
- return
- }
- func main() {
- s := strings.NewReader(
- "Lbh penpxrq gur pbqr!")
- r := rot13Reader{s}
- io.Copy(os.Stdout, &r)
- }
Exercise: Web Crawler
- type UrlData struct {
- url string
- depth int
- }
- type Fetcher interface {
- // Fetch returns the body of URL and
- // a slice of URLs found on that page.
- Fetch(url string) (body string, urls []string, err error)
- }
- // Crawl uses fetcher to recursively crawl
- // pages starting with url, to a maximum of depth.
- func Crawl(url string, depth int, fetcher Fetcher,urldata chan<- *UrlData,quit chan<- int) {
- // TODO: Fetch URLs in parallel.
- // TODO: Don't fetch the same URL twice.
- // This implementation doesn't do either:
- defer func() { quit <- 1}()
- 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)
- for _, u := range urls {
- urldata <- &UrlData{u,depth-1}
- }
- return
- }
- func main() {
- urldata := make(chan *UrlData)
- quit := make(chan int)
- url_cache := make(map[string]bool)
- // url_cache["http://golang.org/"] = true;
- // go Crawl("http://golang.org/", 4, fetcher,urldata,quit)
- go func() { urldata <- &UrlData{"http://golang.org/",4} }()
- Loop:
- for i:=0;; {
- select {
- case <-quit:
- i--
- if i==0 {
- break Loop
- }
- case url := <- urldata:
- if url_cache[url.url] {
- break;
- }
- url_cache[url.url]=true
- go Crawl(url.url,url.depth,fetcher,urldata,quit);
- i++;
- }
- }
- }
Go語言更加靈活,如聲明更加便捷,能夠直接用短聲明(:=), Switch能夠沒有condition,另外也能夠在case中進行判斷;包含了function value,可以對函數更有效處理;另外函數能夠同時返回多個值,方便處理;包含了interface,並且struct和任意封裝類型均可以擴展方法;除此以外,Go 中包含了function value,Closures,以及很強大的Goroutines,這個太強大了,我瞭解的很少,還須要後續繼續研究。
。