Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Something about Golang

Something about Golang

Anton Arhipov

August 19, 2015
Tweet

More Decks by Anton Arhipov

Other Decks in Programming

Transcript

  1. Меню Закуска Краткий обзор синтаксиса Go Основные блюда Возможности платформы

    Инструментарий Десерт Очень субъективное мнение прожжёного “джависта”
  2. Меню Закуска Краткий обзор синтаксиса Go Основные блюда Возможности платформы

    Инструментарий Десерт Очень субъективное мнение прожжёного “джависта”
  3. Меню Закуска Краткий обзор синтаксиса Go Основные блюда Возможности платформы

    Инструментарий Десерт Очень субъективное мнение прожжёного “джависта”
  4. “Can't reach the pedals. no brakes. gaining speed. eyes bulging

    in horror. technical debt crash eminent. “ — Tim Dysinger, @dysinger Не достаёт до педалей. Нет тормозов. Набирает скорость. Глаза полны ужаса. Знаменит катастрофой технического долга
  5. Paul Phillips @extempore2 “go is a terrible, terrible language, yet

    still a major productivity boost. Amdahl's law in another context.” “You often see languages which are fighting the last war. Go is fighting the War of 1812.”
  6. “reduce: what you will do with your expectations after you

    start with Go” “Rust and Scala drown you in complexity. Go drowns you in simplicity.” Paul Phillips @extempore2
  7. package  main   import  "fmt"   func  main()  {  

      fmt.Println("Hello,  Devclub!")   }  
  8. package  main   import  "fmt"   func  main()  {  

      fmt.Println("Hello,  Devclub!")   }   Реакиця Java-программиста на названия функций с заглавной буквы
  9. func  main()  {     fmt.Println("1  +  2  =",  add(1,

     2))   }   func  add(a  int,  b  int)  int  {     return  a  +  b   } Функции
  10. func  main()  {     fmt.Println("1  +  2  =",  add(1,

     2))   }   func  add(a  int,  b  int)  int  {     return  a  +  b   } Функции
  11. func  main()  {     fmt.Println("1  +  2  =",  add(1,

     2))   }   func  add(a,  b  int)  int  {     return  a  +  b   } Функции
  12. func  main()  {      s,  p  :=  calculate(1,  2)

        fmt.Printf("1+2=%d,  1*2=%d",  s,  p)   }   func  calculate(a,  b  int)  (int,  int)  {      return  a  +  b,  a  *  b   } Функции
  13. func  main()  {      s,  p  :=  calculate(1,  2)

        fmt.Printf("1+2=%d,  1*2=%d",  s,  p)   }   func  calculate(a,  b  int)  (int,  int)  {      return  a  +  b,  a  *  b   } Функции
  14. func  main()  {      s,  p  :=  calculate(1,  2)

        fmt.Printf("1+2=%d,  1*2=%d",  s,  p)   }   func  calculate(a,  b  int)  (s,  p  int)  {      s  :=  a  +  b      p  :=  a  *  b      return   } Функции
  15. func  main()  {      double  :=  func(a  int)  int

     {            return  a  *  2      }     double(14)   }   Функции как значения
  16. func  main()  {      double  :=  factory()    

    double(14)   }   func  factory()  func(a  int)  int  {      return  func(a  int)  int  {            return  a  *  2      }   } Функции как значения
  17. Массивы var  a  [4]int   a[0]  =  1   i

     :=  a[0] http://blog.golang.org/go-slices-usage-and-internals arr  :=  [2]string{"Foo",  "Bar"} arr  :=  […]string{"Foo",  "Bar"}
  18. Слайсы Slices a  :=  []int{1,  2,  3}      //

     [1  2  3] Нет описания размерности b  :=  append(a,  4,  5)    //  [1  2  3  4  5] c  :=  make(c,  3)              //  [0  0  0] d  :=  b[1:3]                      //  [2  3] e  :=  b[:3]                        //  [1  2  3]
  19. Мапы Maps   monthdays  :=  map[string]int{       "Jan":

     31,  "Feb":  28,  "Mar":  31,       "Apr":  30,  "May":  31,  "Jun":  30,       "Jul":  31,  "Aug":  31,  "Sep":  30,       "Oct":  31,  "Nov":  30,  "Dec":  31,     }     for  month,  days  :=  range  monthdays  {       fmt.Println(month,  days)     }
  20. Мапы Maps   monthdays  :=  map[string]int{       "Jan":

     31,  "Feb":  28,  "Mar":  31,       "Apr":  30,  "May":  31,  "Jun":  30,       "Jul":  31,  "Aug":  31,  "Sep":  30,       "Oct":  31,  "Nov":  30,  "Dec":  31,     }     for  month,  days  :=  range  monthdays  {       fmt.Println(month,  days)     } Вот эта запятая - обязательна!
  21. Мапы Maps   monthdays  :=  map[string]int{       "Jan":

     31,  "Feb":  28,  "Mar":  31,       "Apr":  30,  "May":  31,  "Jun":  30,       "Jul":  31,  "Aug":  31,  "Sep":  30,       "Oct":  31,  "Nov":  30,  "Dec":  31,     }     value,  ok  :=  monthdays["Jan"]
    fmt.Println(value)    //    31      fmt.Println(ok)          //    true
  22. Указатели var  p  *int   i  :=  42   p

     =  &i     fmt.Println(*p)   *p  =  21   fmt.Println(i) 42 21
  23. Указатели var  p  *int   i  :=  42   p

     =  &i     fmt.Println(*p)   *p  =  21   fmt.Println(i)
  24. Указатели var  p  *int   i  :=  42   p

     =  &i     fmt.Println(*p)   *p  =  21   fmt.Println(i) Нет арифметики указателей
  25. Структуры type  Vertex  struct  {      X  int  

       Y  int   }   func  main()  {      fmt.Println(Vertex{1,  2})   }
  26. Методы type  Vertex  struct  {      X  int  

       Y  int   }   func  (v  Vertex)  Total()  int  {      return  v.X  +  v.Y   }
  27. Методы type  Vertex  struct  {      X  int  

       Y  int   }   func  (v  Vertex)  Total()  int  {      return  v.X  +  v.Y   } v  :=  Vertex{1,  2}   v.Total()
  28. Интерфейсы type  Entity  interface  {      Total()  int  

    }   Vertex реализует Entity func  (v  Vertex)  Total()  int  {      return  v.X  +  v.Y   }
  29. Интерфейсы func  foo(x  interface{})  int  {        x.(Vertex).Total()

      } panic:  interface  conversion:  interface  is  main.Vertex2,  not  main.Vertex   goroutine  1  [running]:   main.main()     main.go:25  +0xcd   exit  status  2   foo(Vertex2{1,2})
  30. A programmer had a problem. He thought to solve it

    with threads. two Now problems. he has
  31. func  ready(w  string,  sec  int)  {     time.Sleep(time.Duration(sec)  *

     time.Second)     fmt.Println(w,  "is  ready!")   }   func  main()  {     go  ready("Tea",  2)     go  ready("Coffee",  1)     fmt.Println("I'm  waiting")     time.Sleep(5  *  time.Second)   } I’m waiting Coffee is ready Tea is ready
  32. Каналы ci  :=  make(chan  int)   cs  :=  make(chan  string)

      cf  :=  make(chan  interface{}) ci <- 1 ← послать 1 в канал ci i := <-ci ← принять int из канала ci
  33. var  c  chan  int   func  ready(w  string,  sec  int)

     {     time.Sleep(time.Duration(sec)  *  time.Second)     fmt.Println(w,  "is  ready!”)      с  <-­‐  1   }   func  main()  {     go  ready("Tea",  2)     go  ready("Coffee",  1)     fmt.Println("I'm  waiting")      <-­‐c      <-­‐c   }
  34. var  done  =  make(chan  bool)   var  msgs  =  make(chan

     int)   func  produce()  {     for  i  :=  0;  i  <  10;  i++  {       msgs  <-­‐  i     }     done  <-­‐  true   }   func  consume()  {     for  {       msg  :=  <-­‐msgs       println(msg)     }   }   func  main()  {     go  produce()     go  consume()     <-­‐  done   }
  35. var  done  =  make(chan  bool)   var  msgs  =  make(chan

     int)   func  produce()  {     for  i  :=  0;  i  <  10;  i++  {       msgs  <-­‐  i     }     done  <-­‐  true   }   func  consume()  {     for  {       msg  :=  <-­‐msgs       println(msg)     }   }   func  main()  {     go  produce()     go  consume()     <-­‐  done   } Запустить  го-­‐рутины
  36. var  done  =  make(chan  bool)   var  msgs  =  make(chan

     int)   func  produce()  {     for  i  :=  0;  i  <  10;  i++  {       msgs  <-­‐  i     }     done  <-­‐  true   }   func  consume()  {     for  {       msg  :=  <-­‐msgs       println(msg)     }   }   func  main()  {     go  produce()     go  consume()     <-­‐  done   } Высылаем  значения
  37. var  done  =  make(chan  bool)   var  msgs  =  make(chan

     int)   func  produce()  {     for  i  :=  0;  i  <  10;  i++  {       msgs  <-­‐  i     }     done  <-­‐  true   }   func  consume()  {     for  {       msg  :=  <-­‐msgs       println(msg)     }   }   func  main()  {     go  produce()     go  consume()     <-­‐  done   } Получаем  и  выводим  значения
  38. var  done  =  make(chan  bool)   var  msgs  =  make(chan

     int)   func  produce()  {     for  i  :=  0;  i  <  10;  i++  {       msgs  <-­‐  i     }     done  <-­‐  true   }   func  consume()  {     for  {       msg  :=  <-­‐msgs       println(msg)     }   }   func  main()  {     go  produce()     go  consume()     <-­‐  done   } Готово!
  39. Инструментарий • go (version, build, test, get, install, …) •

    gofmt • godoc • Редакторы (vim, atom, IntelliJ IDEA)
  40. Чего не хватает? Отладчик Плагин для IntelliJ IDEA - в

    разработке Возможна работа с GDB, но лучше сразу умереть Менеджер зависимостей Много разных решений, все кривые -vendor в 1.5
  41. Кросс-компиляция http://dave.cheney.net/2015/03/03/cross-compilation-just-got- a-whole-lot-better-in-go-1-5 env GOOS=linux GOARCH=386 go build hello.go 1.

    Собрал на Mac OS X для Linux 2. Запустил бинарник без дополнительных библиотек на Linux
  42. Тестирование package  math   func  Add(a,  b  int)  int  {

        return  a  +  b   } package  math   import  "testing"   func  TestAdd(t  *testing.T){     if  Add(1,  3)  !=  4  {       t.Error("Expecting  4")     }   }  
  43. Тестирование package  math   func  Add(a,  b  int)  int  {

        return  a  +  b   } package  math   import  "testing"   func  TestAdd(t  *testing.T){     if  Add(1,  3)  !=  4  {       t.Error("Expecting  4")     }   }   /usr/local/go/bin/go  test  -­‐v  ./...  -­‐run  ^TestAdd$   Testing  started  at  03:35  ...   ?         _/Users/anton/work-­‐src/mygo   [no  test  files]PASS   ok       _/Users/anton/work-­‐src/mygo/math   0.007s
  44. “У меня вот другой вопрос - а опердени на Go

    писать то уже можно или им только стартапы да уставшие программисты балуются ?” Вопрос на миллион долларов — Евгений Холодков Профессионально разрабатывает опердени уже много лет
  45. Опердень package  main   import  "net/http"   func  main()  {

        panic(http.ListenAndServe(":8080",          http.FileServer(http.Dir("."))))   }