Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Язык Goдля Perl-программистов
— Зачем знать про Go?— Откуда про него узнать?— Зачем нужен Go?
Почему Goна Perl-мероприятии?
Кругозор
Тренды
XXI век
Дух перла (совсем немного)
Дух перла (совсем немного)        душок :-)
UTF-8всегда и везде
UTF-8     всегда и вездеДаже в именах переменных
UTF-8     всегда и вездеДаже в именах переменных         Perl 6!
return	  a,	  b
return	  a,	  b      Perl!
golang.orgНаписан на Go
tour.golang.orgЕсть офлайновая версия
goprogrammingbook.com
Март 2012
$	  godoc	  -­‐http=:6060Локальный golang.org
«   The Go programming    language is an open source    project to make    programmers more    productive.»
«   Perl is a general-purpose    programming language    originally developed for    text manipulation »
«   Go is expressive, concise,    clean, and efficient. »
«   The language is intended    to be practical <. . .> rather    than beautiful  »
Go —компилируемый     язык
Go —быстрокомпилируемый        язык
C-подобный синтаксис
Скорость компиляцииопределяет синтаксис
Встроенный сборщик мусора
Ни на что не похожие    интерфейсы
Нет ООП и наследования
В начале 2012  обещают    GO 1.0
В GO 1.0зафиксируют синтаксис
Не все старые программыработают в новых релизах Go
Не все старые программыработают в новых релизах Go          Perl 6!
— Синтаксис— Интерфейсы
Синтаксис
01-­‐hello.go        interface.go          q3.goaddr_in_noninit.go   interface_vars.go     q4-­‐2.goarray.go             i...
Hello, World!
package	  mainimport	  "fmt"func	  main()	  {	  	  	  fmt.Println("Hello,	  World!")}
Многабукаф?
Javaclass	  HelloWorld	  {	  	  	  	  static	  public	  	  	  	  void	  main(String	  args[])	  {	  	  	  	  	  	  	  	  S...
C++#include<iostream>int	  main()	  {	  	  	  	  std::cout	  <<	  "Hello,	  World!n";	  	  	  	  return	  0;}
Gopackage	  mainimport	  "fmt"func	  main()	  {	  	  	  fmt.Println("Hello,	  World!")}
package	  mainimport	  "fmt"func	  main()	  {	  	  	  fmt.Println("Hello,	  World!")}
;
package	  mainimport	  "fmt"func	  main()	  {	  	  	  fmt.Println("Hello,	  World!")}
package	  main;import	  "fmt";func	  main()	  {	  	  	  fmt.Println("Hello,	  World!");}
package	  main;import	  "fmt";func	  main()	  {	  	  	  fmt.Println("Hello,	  World!");}
package	  main;import	  "fmt";func	  main()	  {	  	  	  fmt.Println("Hello,	  World!");}
f()
func	  factorial(n	  int)	  (int)	  {	  	  	  	  if	  (n	  <	  2)	  {	  	  	  	  	  	  	  	  return	  1	  	  	  	  }	  	  ...
func	  factorial(n	  int)	  (int)	  {	  	  	  	  if	  (n	  <	  2)	  {	  	  	  	  	  	  	  	  return	  1	  	  	  	  }	  	  ...
func	  factorial(n	  int)	  (int)	  {	  	  	  	  if	  (n	  <	  2)	  {	  	  	  	  	  	  	  	  return	  1	  	  	  	  }	  	  ...
Gofunc	  factorial(n	  int)	  (int)	  {	  	  	  	  if	  (n	  <	  2)	  {	  	  	  	  	  	  	  	  return	  1	  	  	  	  }	  	...
C++int	  factorial(n	  int)	  {	  	  	  	  if	  (n	  <	  2)	  {	  	  	  	  	  	  	  	  return	  1	  	  	  	  }	  	  	  	  ...
:=
:=Да-да, навеяно Паскалем
«Динамические типы»
boolstringint	  	  int8	  	  int16	  	  int32	  	  int64uint	  uint8	  uint16	  uint32	  uint64	  uintptrfloat32	  float64...
func	  main()	  {	  	  	  	  for	  c	  :=	  0;	  c	  !=	  10;	  c++	  {	   	  	  	  	  	  fmt.Printf(    	  	  	  	  	  	 ...
var	  x	  int
var	  x	  int	  =	  10
 	  	  	  x	  :=	  10
var	  x	  int	  =	  10	  	  	  	  x	  :=	  10      Одно и то же
defer
«Стек	  блоков	  END»
func	  d()	  {	  	  	  	  defer	  fmt.Println("Before	  2")	  	  	  	  defer	  fmt.Println("Before	  1")	  	  	  	  	  	  ...
func	  d()	  {	  	  	  	  defer	  fmt.Println("Before	  2")	  	  	  	  defer	  fmt.Println("Before	  1")	  	  	  	  	  	  ...
range
each	  в	  перле
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  k,	  v	  :=	  range	  li...
_
Это не $_
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  k,	  v	  :=	  range	  li...
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  k,	  v	  :=	  range	  li...
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  k,	  v	  :=	  range	  li...
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  _,	  v	  :=	  range	  li...
Похоже на(undef,	  $v)	  =	  @list;
package	  mainfunc	  main()	  {	  	  	  	  var	  list	  =	  []string{"a",	  "b"}	  	  	  	  for	  _,	  v	  :=	  range	  li...
Интерфейсы
Нет классов
Нет наследования
Есть методы
type	  I	  interface	  {	  	  	  	  Get()	  int	  	  	  	  Set(int)}
func	  assign_and_print(x	  I,	  v	  int)	  {	  	  	  	  x.Set(v)	  	  	  	  fmt.Printf("%vn",	  x.Get())}
func	  assign_and_print(x	  I,	  v	  int)	  {	  	  	  	  x.Set(v)	  	  	  	  fmt.Printf("%vn",	  x.Get())}
type	  s	  struct	  {	  	  	  	  i	  int}
func	  (x	  *s)	  Get()	  int	  {	  	  	  	  return	  x.i}func	  (x	  *s)	  Set(i	  int)	  {	  	  	  	  x.i	  =	  i}
func	  assign_and_print(x	  I,	  v	  int)	  {	  	  	  	  x.Set(v)	  	  	  	  fmt.Printf("%vn",	  x.Get())}
func	  main()	  {	  	  	  	  var	  y	  s	  	  	  	  assign_and_print(&y,	  42)}
Пример 1  Wiki
func	  main()	  {	  	  	  	  http.HandleFunc("/view/",	  viewHandler)	  	  	  	  http.HandleFunc("/edit/",	  editHandler)	...
func	  main()	  {	  	  	  	  http.HandleFunc("/view/",	  viewHandler)	  	  	  	  http.HandleFunc("/edit/",	  editHandler)	...
func	  viewHandler(w	  http.ResponseWriter,	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  r	  *http.Request)	  {	  ...
func	  viewHandler(w	  http.ResponseWriter,	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  r	  *http.Request)	  {	  ...
func	  loadPage(title	  string)	  (*Page,	  os.Error)	  {	  	  	  	  filename	  :=	  title	  +	  ".txt"	  	  	  	  body,	 ...
func	  loadPage(title	  string)	  (*Page,	  os.Error)	  {	  	  	  	  filename	  :=	  title	  +	  ".txt"	  	  	  	  body,	 ...
type	  Page	  struct	  {	  	  	  	  Title	  string	  	  	  	  Body	  []byte}
func	  main()	  {	  	  	  	  http.HandleFunc("/view/",	  viewHandler)	  	  	  	  http.HandleFunc("/edit/",	  editHandler)	...
func	  editHandler(w	  http.ResponseWriter,	  r	  *http.Request)	  {	  	  	  	  title	  :=	  r.URL.Path[lenPath:]	  	  	  ...
func	  main()	  {	  	  	  	  http.HandleFunc("/view/",	  viewHandler)	  	  	  	  http.HandleFunc("/edit/",	  editHandler)	...
func	  saveHandler(w	  http.ResponseWriter,	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  r	  *http.Request)	  {	  ...
func	  saveHandler(w	  http.ResponseWriter,	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  r	  *http.Request)	  {	  ...
func	  (p	  *Page)	  save()	  os.Error	  {	  	  	  	  filename	  :=	  p.Title	  +	  ".txt"	  	  	  	  return	  ioutil.Writ...
func	  (p	  *Page)	  save()	  os.Error	  {	  	  	  	  filename	  :=	  p.Title	  +	  ".txt"	  	  	  	  return	  ioutil.Writ...
— Параллельность— Обмен данными  между потоками
Горутины    и каналы
-­‐>
<-­‐
Пример 2Sleep sort
#!/bin/bashfunction	  f()	  {	  	  	  	  sleep	  "$1"	  	  	  	  echo	  "$1"}while	  [	  -­‐n	  "$1"	  ]do	  	  	  	  f	  ...
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
var	  get_value	  chan	  int	  	  	  	  get_value	  =	  make(chan	  int)
var	  get_value	  chan	  int	  	  	  	  get_value	  =	  make(chan	  int)get_value	  <-­‐	  x                 Запись в канал
var	  get_value	  chan	  int	  	  	  	  get_value	  =	  make(chan	  int)get_value	  <-­‐	  x                 Запись в кана...
go	  f(x,	  y,	  z)
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
func	  main()	  {	  	  	  	  	  values	  :=	  []int{3,	  1,	  ...,	  10}	  	  	  	  	  get_value	  =	  make(chan	  int)	  ...
func	  send_value(x	  int)	  {	  	  	  	  	  time.Sleep(int64(x)	  *	  1E8)	  	  	  	  	  get_value	  <-­‐	  x}
func	  send_value(x	  int)	  {	  	  	  	  	  time.Sleep(int64(x)	  *	  1E8)	  	  	  	  	  get_value	  <-­‐	  x}
func	  send_value(x	  int)	  {	  	  	  	  	  time.Sleep(int64(x)	  *	  1E8)	  	  	  	  	  get_value	  <-­‐	  x}
— Стандартные модули— «CPAN»
golang.org/pkgarchive/tar   exec        netarchive/zip   exp/regex   os/*big           flag        path/filepathbufio     ...
code.google.com/p/*   github.com/*
Все тесты к этой презентации:  github.com/ash/go-tests   Андрей Шитов andy@shitov.ru
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
Upcoming SlideShare
Loading in …5
×

Язык программирования Go для Perl-программистов

3,028 views

Published on

Введение в язык программирования Go с интересными примерами.

Published in: Technology
  • Be the first to comment

Язык программирования Go для Perl-программистов

  1. 1. Язык Goдля Perl-программистов
  2. 2. — Зачем знать про Go?— Откуда про него узнать?— Зачем нужен Go?
  3. 3. Почему Goна Perl-мероприятии?
  4. 4. Кругозор
  5. 5. Тренды
  6. 6. XXI век
  7. 7. Дух перла (совсем немного)
  8. 8. Дух перла (совсем немного) душок :-)
  9. 9. UTF-8всегда и везде
  10. 10. UTF-8 всегда и вездеДаже в именах переменных
  11. 11. UTF-8 всегда и вездеДаже в именах переменных Perl 6!
  12. 12. return  a,  b
  13. 13. return  a,  b Perl!
  14. 14. golang.orgНаписан на Go
  15. 15. tour.golang.orgЕсть офлайновая версия
  16. 16. goprogrammingbook.com
  17. 17. Март 2012
  18. 18. $  godoc  -­‐http=:6060Локальный golang.org
  19. 19. « The Go programming language is an open source project to make programmers more productive.»
  20. 20. « Perl is a general-purpose programming language originally developed for text manipulation »
  21. 21. « Go is expressive, concise, clean, and efficient. »
  22. 22. « The language is intended to be practical <. . .> rather than beautiful »
  23. 23. Go —компилируемый язык
  24. 24. Go —быстрокомпилируемый язык
  25. 25. C-подобный синтаксис
  26. 26. Скорость компиляцииопределяет синтаксис
  27. 27. Встроенный сборщик мусора
  28. 28. Ни на что не похожие интерфейсы
  29. 29. Нет ООП и наследования
  30. 30. В начале 2012 обещают GO 1.0
  31. 31. В GO 1.0зафиксируют синтаксис
  32. 32. Не все старые программыработают в новых релизах Go
  33. 33. Не все старые программыработают в новых релизах Go Perl 6!
  34. 34. — Синтаксис— Интерфейсы
  35. 35. Синтаксис
  36. 36. 01-­‐hello.go interface.go q3.goaddr_in_noninit.go interface_vars.go q4-­‐2.goarray.go iota.go q4-­‐4.goassign-­‐new.go iota_print-­‐1.go q4.goblank.go iota_print-­‐2.go q6.gochannel.go iota_print.go q7.goclose_channel.go len.go q9.gocomplex.go map.go random-­‐select.gocopy-­‐array.go map_autovivif.go range-­‐string.godb.go map_non_existent.go range.godefer-­‐func.go mul_int64.go receiver.godefer.go openfile.go recover.godial.go panic.go reslice.goecho.go pointer.go sort-­‐delay-­‐1.goeven-­‐use.go pp.go sort-­‐delay.goeven.go println.go sort.gofactorial.go q10.go string_range.gofmt.go q11.go struct.gogoroutine.go q12.go switch.goimport_.go q12a.go type-­‐struct.goinit.go q2-­‐2.go var.goint_method.go q2-­‐3.go variadic.go
  37. 37. Hello, World!
  38. 38. package  mainimport  "fmt"func  main()  {      fmt.Println("Hello,  World!")}
  39. 39. Многабукаф?
  40. 40. Javaclass  HelloWorld  {        static  public        void  main(String  args[])  {                System.out.println(                      "Hello,  World!"                );        }}
  41. 41. C++#include<iostream>int  main()  {        std::cout  <<  "Hello,  World!n";        return  0;}
  42. 42. Gopackage  mainimport  "fmt"func  main()  {      fmt.Println("Hello,  World!")}
  43. 43. package  mainimport  "fmt"func  main()  {      fmt.Println("Hello,  World!")}
  44. 44. ;
  45. 45. package  mainimport  "fmt"func  main()  {      fmt.Println("Hello,  World!")}
  46. 46. package  main;import  "fmt";func  main()  {      fmt.Println("Hello,  World!");}
  47. 47. package  main;import  "fmt";func  main()  {      fmt.Println("Hello,  World!");}
  48. 48. package  main;import  "fmt";func  main()  {      fmt.Println("Hello,  World!");}
  49. 49. f()
  50. 50. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}
  51. 51. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}
  52. 52. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}
  53. 53. Gofunc  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}
  54. 54. C++int  factorial(n  int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}
  55. 55. :=
  56. 56. :=Да-да, навеяно Паскалем
  57. 57. «Динамические типы»
  58. 58. boolstringint    int8    int16    int32    int64uint  uint8  uint16  uint32  uint64  uintptrfloat32  float64complex64  complex128
  59. 59. func  main()  {        for  c  :=  0;  c  !=  10;  c++  {            fmt.Printf(                "%d!  =  %dn",                c,  factorial(c))        }}
  60. 60. var  x  int
  61. 61. var  x  int  =  10
  62. 62.        x  :=  10
  63. 63. var  x  int  =  10        x  :=  10 Одно и то же
  64. 64. defer
  65. 65. «Стек  блоков  END»
  66. 66. func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("an")                return}
  67. 67. func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("an")                return} a Before  1 Before  2
  68. 68. range
  69. 69. each  в  перле
  70. 70. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        }}
  71. 71. _
  72. 72. Это не $_
  73. 73. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        }}
  74. 74. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        }}
  75. 75. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        }}range.go:5:  k  declared  and  not  used
  76. 76. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  _,  v  :=  range  list  {                println(v)        }}
  77. 77. Похоже на(undef,  $v)  =  @list;
  78. 78. package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  _,  v  :=  range  list  {                println(v)        }} Struct literal
  79. 79. Интерфейсы
  80. 80. Нет классов
  81. 81. Нет наследования
  82. 82. Есть методы
  83. 83. type  I  interface  {        Get()  int        Set(int)}
  84. 84. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get())}
  85. 85. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get())}
  86. 86. type  s  struct  {        i  int}
  87. 87. func  (x  *s)  Get()  int  {        return  x.i}func  (x  *s)  Set(i  int)  {        x.i  =  i}
  88. 88. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get())}
  89. 89. func  main()  {        var  y  s        assign_and_print(&y,  42)}
  90. 90. Пример 1 Wiki
  91. 91. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}
  92. 92. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}
  93. 93. func  viewHandler(w  http.ResponseWriter,                                    r  *http.Request)  {        title  :=  r.URL.Path[lenPath:]        p,  err  :=  loadPage(title)        if  err  ==  nil  {                fmt.Fprintf(w,                        "<h1>%s</h1><div>%s</div>",                        p.Title,  p.Body)        }  else  {                http.Redirect(w,  r,                          "/edit/"  +  title,  http.StatusFound)                return        }}
  94. 94. func  viewHandler(w  http.ResponseWriter,                                    r  *http.Request)  {        title  :=  r.URL.Path[lenPath:]        p,  err  :=  loadPage(title)        if  err  ==  nil  {                fmt.Fprintf(w,                        "<h1>%s</h1><div>%s</div>",                        p.Title,  p.Body)        }  else  {                http.Redirect(w,  r,                          "/edit/"  +  title,  http.StatusFound)                return        }}
  95. 95. func  loadPage(title  string)  (*Page,  os.Error)  {        filename  :=  title  +  ".txt"        body,  err  :=  ioutil.ReadFile(filename)                if  err  !=  nil  {                return  nil,  err        }                return  &Page{Title:  title,  Body:  body},  nil}
  96. 96. func  loadPage(title  string)  (*Page,  os.Error)  {        filename  :=  title  +  ".txt"        body,  err  :=  ioutil.ReadFile(filename)                if  err  !=  nil  {                return  nil,  err        }                return  &Page{Title:  title,  Body:  body},  nil}
  97. 97. type  Page  struct  {        Title  string        Body  []byte}
  98. 98. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}
  99. 99. func  editHandler(w  http.ResponseWriter,  r  *http.Request)  {        title  :=  r.URL.Path[lenPath:]        p,  err  :=  loadPage(title)        if  err  !=  nil  {                p  =  &Page{Title:  title}        }                fmt.Fprintf(w,  "<h1>Editing  %s</h1>"  +                "<form  action="/save/%s"  method="POST">"  +                "<textarea  name="body">%s</textarea><br  />"  +                "<input  type="submit"  value="Save"  />"  +                "</form>",                p.Title,  p.Title,  p.Body)}
  100. 100. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}
  101. 101. func  saveHandler(w  http.ResponseWriter,                                    r  *http.Request)  {        title  :=  r.URL.Path[lenPath:]        body  :=  r.FormValue("body")        p  :=  &Page{Title:  title,  Body:  []byte(body)}        p.save()                http.Redirect(w,  r,                    "/view/"  +  title,  http.StatusFound)}
  102. 102. func  saveHandler(w  http.ResponseWriter,                                    r  *http.Request)  {        title  :=  r.URL.Path[lenPath:]        body  :=  r.FormValue("body")        p  :=  &Page{Title:  title,  Body:  []byte(body)}        p.save()                http.Redirect(w,  r,                    "/view/"  +  title,  http.StatusFound)}
  103. 103. func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600)}
  104. 104. func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600)}p.save()
  105. 105. — Параллельность— Обмен данными между потоками
  106. 106. Горутины и каналы
  107. 107. -­‐>
  108. 108. <-­‐
  109. 109. Пример 2Sleep sort
  110. 110. #!/bin/bashfunction  f()  {        sleep  "$1"        echo  "$1"}while  [  -­‐n  "$1"  ]do        f  "$1"  &        shiftdonewait
  111. 111. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  112. 112. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  113. 113. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  114. 114. var  get_value  chan  int        get_value  =  make(chan  int)
  115. 115. var  get_value  chan  int        get_value  =  make(chan  int)get_value  <-­‐  x Запись в канал
  116. 116. var  get_value  chan  int        get_value  =  make(chan  int)get_value  <-­‐  x Запись в каналy  :=  <-­‐  get_value Чтение из канала
  117. 117. go  f(x,  y,  z)
  118. 118. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  119. 119. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  120. 120. func  main()  {          values  :=  []int{3,  1,  ...,  10}          get_value  =  make(chan  int)          for  _,  x  :=  range  values  {                  go  send_value(x)                    }            for  range  values  {                  fmt.Println(<-­‐  get_value)          }}
  121. 121. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}
  122. 122. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}
  123. 123. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}
  124. 124. — Стандартные модули— «CPAN»
  125. 125. golang.org/pkgarchive/tar exec netarchive/zip exp/regex os/*big flag path/filepathbufio fmt rpcbytes go/* runtime/*cmath hash/* smtpcompress/* http/cgi sortcontainer/* http/fcgi testing/*crypto/* image/* timedebug io/ioutil unicodeebnf log websocketencoding mail xml
  126. 126. code.google.com/p/* github.com/*
  127. 127. Все тесты к этой презентации: github.com/ash/go-tests Андрей Шитов andy@shitov.ru

×