SlideShare a Scribd company logo
Язык 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.go
addr_in_noninit.go   interface_vars.go     q4-­‐2.go
array.go             iota.go               q4-­‐4.go
assign-­‐new.go      iota_print-­‐1.go     q4.go
blank.go             iota_print-­‐2.go     q6.go
channel.go           iota_print.go         q7.go
close_channel.go     len.go                q9.go
complex.go           map.go                random-­‐select.go
copy-­‐array.go      map_autovivif.go      range-­‐string.go
db.go                map_non_existent.go   range.go
defer-­‐func.go      mul_int64.go          receiver.go
defer.go             openfile.go           recover.go
dial.go              panic.go              reslice.go
echo.go              pointer.go            sort-­‐delay-­‐1.go
even-­‐use.go        pp.go                 sort-­‐delay.go
even.go              println.go            sort.go
factorial.go         q10.go                string_range.go
fmt.go               q11.go                struct.go
goroutine.go         q12.go                switch.go
import_.go           q12a.go               type-­‐struct.go
init.go              q2-­‐2.go             var.go
int_method.go        q2-­‐3.go             variadic.go
Hello, World!
package	
  main

import	
  "fmt"

func	
  main()	
  {
	
  	
  	
  fmt.Println("Hello,	
  World!")
}
Многабукаф?
Java

class	
  HelloWorld	
  {
	
  	
  	
  	
  static	
  public
	
  	
  	
  	
  void	
  main(String	
  args[])	
  {
	
  	
  	
  	
  	
  	
  	
  	
  System.out.println(
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Hello,	
  World!"
	
  	
  	
  	
  	
  	
  	
  	
  );
	
  	
  	
  	
  }
}
C++

#include<iostream>

int	
  main()	
  {
	
  	
  	
  	
  std::cout	
  <<	
  "Hello,	
  World!n";
	
  	
  	
  	
  return	
  0;
}
Go

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!")
}
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
	
  	
  	
  	
  }
	
  	
  	
  	
  
	
  	
  	
  	
  return	
  n	
  *	
  factorial(n	
  -­‐	
  1)
}
func	
  factorial(n	
  int)	
  (int)	
  {
	
  	
  	
  	
  if	
  (n	
  <	
  2)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  return	
  1
	
  	
  	
  	
  }
	
  	
  	
  	
  
	
  	
  	
  	
  return	
  n	
  *	
  factorial(n	
  -­‐	
  1)
}
func	
  factorial(n	
  int)	
  (int)	
  {
	
  	
  	
  	
  if	
  (n	
  <	
  2)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  return	
  1
	
  	
  	
  	
  }
	
  	
  	
  	
  
	
  	
  	
  	
  return	
  n	
  *	
  factorial(n	
  -­‐	
  1)
}
Go
func	
  factorial(n	
  int)	
  (int)	
  {
	
  	
  	
  	
  if	
  (n	
  <	
  2)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  return	
  1
	
  	
  	
  	
  }
	
  	
  	
  	
  
	
  	
  	
  	
  return	
  n	
  *	
  factorial(n	
  -­‐	
  1)
}
C++
int	
  factorial(n	
  int)	
  {
	
  	
  	
  	
  if	
  (n	
  <	
  2)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  return	
  1
	
  	
  	
  	
  }
	
  	
  	
  	
  
	
  	
  	
  	
  return	
  n	
  *	
  factorial(n	
  -­‐	
  1)
}
:=
:=
Да-да, навеяно Паскалем
«Динамические типы»
bool

string

int	
  	
  int8	
  	
  int16	
  	
  int32	
  	
  int64
uint	
  uint8	
  uint16	
  uint32	
  uint64	
  
uintptr

float32	
  float64

complex64	
  complex128
func	
  main()	
  {
	
  	
  	
  	
  for	
  c	
  :=	
  0;	
  c	
  !=	
  10;	
  c++	
  {
	
   	
  	
  	
  	
  	
  fmt.Printf(
    	
  	
  	
  	
  	
  	
  	
  	
  "%d!	
  =	
  %dn",
    	
  	
  	
  	
  	
  	
  	
  	
  c,	
  factorial(c))
	
  	
  	
  	
  }
}
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")
	
  	
  	
  	
  
	
  	
  	
  	
  fmt.Printf("an")
	
  	
  	
  	
  
	
  	
  	
  	
  return
}
func	
  d()	
  {
	
  	
  	
  	
  defer	
  fmt.Println("Before	
  2")
	
  	
  	
  	
  defer	
  fmt.Println("Before	
  1")
	
  	
  	
  	
  
	
  	
  	
  	
  fmt.Printf("an")
	
  	
  	
  	
  
	
  	
  	
  	
  return
}
                            a
                            Before	
  1
                            Before	
  2
range
each	
  в	
  перле
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  k,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(k,	
  v)
	
  	
  	
  	
  }
}
_
Это не $_
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  k,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(k,	
  v)
	
  	
  	
  	
  }
}
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  k,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(v)
	
  	
  	
  	
  }
}
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  k,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(v)
	
  	
  	
  	
  }
}

range.go:5:	
  k	
  declared	
  and	
  not	
  used
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  _,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(v)
	
  	
  	
  	
  }
}
Похоже на
(undef,	
  $v)	
  =	
  @list;
package	
  main

func	
  main()	
  {
	
  	
  	
  	
  var	
  list	
  =	
  []string{"a",	
  "b"}

	
  	
  	
  	
  for	
  _,	
  v	
  :=	
  range	
  list	
  {
	
  	
  	
  	
  	
  	
  	
  	
  println(v)
	
  	
  	
  	
  }
}
                                                             Struct literal
Интерфейсы
Нет классов
Нет наследования
Есть методы
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)
	
  	
  	
  	
  http.HandleFunc("/save/",	
  saveHandler)
	
  	
  	
  	
  
	
  	
  	
  	
  http.ListenAndServe(":8080",	
  nil)
}
func	
  main()	
  {
	
  	
  	
  	
  http.HandleFunc("/view/",	
  viewHandler)
	
  	
  	
  	
  http.HandleFunc("/edit/",	
  editHandler)
	
  	
  	
  	
  http.HandleFunc("/save/",	
  saveHandler)
	
  	
  	
  	
  
	
  	
  	
  	
  http.ListenAndServe(":8080",	
  nil)
}
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
	
  	
  	
  	
  }
}
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
	
  	
  	
  	
  }
}
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
}
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
}
type	
  Page	
  struct	
  {
	
  	
  	
  	
  Title	
  string
	
  	
  	
  	
  Body	
  []byte
}
func	
  main()	
  {
	
  	
  	
  	
  http.HandleFunc("/view/",	
  viewHandler)
	
  	
  	
  	
  http.HandleFunc("/edit/",	
  editHandler)
	
  	
  	
  	
  http.HandleFunc("/save/",	
  saveHandler)
	
  	
  	
  	
  
	
  	
  	
  	
  http.ListenAndServe(":8080",	
  nil)
}
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)
}
func	
  main()	
  {
	
  	
  	
  	
  http.HandleFunc("/view/",	
  viewHandler)
	
  	
  	
  	
  http.HandleFunc("/edit/",	
  editHandler)
	
  	
  	
  	
  http.HandleFunc("/save/",	
  saveHandler)
	
  	
  	
  	
  
	
  	
  	
  	
  http.ListenAndServe(":8080",	
  nil)
}
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)
}
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)
}
func	
  (p	
  *Page)	
  save()	
  os.Error	
  {
	
  	
  	
  	
  filename	
  :=	
  p.Title	
  +	
  ".txt"
	
  	
  	
  	
  return	
  ioutil.WriteFile(filename,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  p.Body,	
  0600)
}
func	
  (p	
  *Page)	
  save()	
  os.Error	
  {
	
  	
  	
  	
  filename	
  :=	
  p.Title	
  +	
  ".txt"
	
  	
  	
  	
  return	
  ioutil.WriteFile(filename,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  p.Body,	
  0600)
}




p.save()
— Параллельность
— Обмен данными
  между потоками
Горутины
    и
 каналы
-­‐>
<-­‐
Пример 2

Sleep sort
#!/bin/bash
function	
  f()	
  {
	
  	
  	
  	
  sleep	
  "$1"
	
  	
  	
  	
  echo	
  "$1"
}
while	
  [	
  -­‐n	
  "$1"	
  ]
do
	
  	
  	
  	
  f	
  "$1"	
  &
	
  	
  	
  	
  shift
done
wait
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)
	
  	
  	
  	
  	
  }
}
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)
	
  	
  	
  	
  	
  }
}
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)
	
  	
  	
  	
  	
  }
}
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                 Запись в канал



y	
  :=	
  <-­‐	
  get_value          Чтение из канала
go	
  f(x,	
  y,	
  z)
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)
	
  	
  	
  	
  	
  }
}
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)
	
  	
  	
  	
  	
  }
}
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)
	
  	
  	
  	
  	
  }
}
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/pkg
archive/tar   exec        net
archive/zip   exp/regex   os/*
big           flag        path/filepath
bufio         fmt         rpc
bytes         go/*        runtime/*
cmath         hash/*      smtp
compress/*    http/cgi    sort
container/*   http/fcgi   testing/*
crypto/*      image/*     time
debug         io/ioutil   unicode
ebnf          log         websocket
encoding      mail        xml
code.google.com/p/*
   github.com/*
Все тесты к этой презентации:
  github.com/ash/go-tests




   Андрей Шитов andy@shitov.ru

More Related Content

What's hot

Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
Python Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
file handling in c
file handling in cfile handling in c
file handling in c
Maxim Shaptala
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
PyNSK
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Yandex
 
Haskell
HaskellHaskell
Haskell
DevDay
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
Mail.ru Group
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
Alexey Paznikov
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Python Meetup
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
Python Meetup
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
Egor Chernyshev
 

What's hot (20)

Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
file handling in c
file handling in cfile handling in c
file handling in c
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Haskell
HaskellHaskell
Haskell
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 

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

Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
SQALab
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Timur Safin
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
Sergey Pronin
 
implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)
Ruslan Shevchenko
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
PHP basic
PHP basicPHP basic
PHP basic
Noveo
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JSFestUA
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
SmartTools
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
Fwdays
 
09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
Roman Brovko
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
Alexander Granin
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
 

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

Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
PHP basic
PHP basicPHP basic
PHP basic
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
 
Bytecode
BytecodeBytecode
Bytecode
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 

More from Andrew Shitov

Perl6 one-liners
Perl6 one-linersPerl6 one-liners
Perl6 one-liners
Andrew Shitov
 
Creating a compiler in Perl 6
Creating a compiler in Perl 6Creating a compiler in Perl 6
Creating a compiler in Perl 6
Andrew Shitov
 
Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)
Andrew Shitov
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
Andrew Shitov
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
Andrew Shitov
 
AllPerlBooks.com
AllPerlBooks.comAllPerlBooks.com
AllPerlBooks.com
Andrew Shitov
 
Perl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingPerl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel Computing
Andrew Shitov
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of SmartmatchAndrew Shitov
 
YAPC::Europe 2013
YAPC::Europe 2013YAPC::Europe 2013
YAPC::Europe 2013
Andrew Shitov
 
Perl 7, the story of
Perl 7, the story ofPerl 7, the story of
Perl 7, the story of
Andrew Shitov
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
Andrew Shitov
 
What's new in Perl 5.14
What's new in Perl 5.14What's new in Perl 5.14
What's new in Perl 5.14
Andrew Shitov
 
Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6
Andrew Shitov
 
There's more than one way to empty it
There's more than one way to empty itThere's more than one way to empty it
There's more than one way to empty it
Andrew Shitov
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
Andrew Shitov
 
How to clean an array
How to clean an arrayHow to clean an array
How to clean an array
Andrew Shitov
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
Andrew Shitov
 
Say Perl на весь мир
Say Perl на весь мирSay Perl на весь мир
Say Perl на весь мир
Andrew Shitov
 
Personal Perl 6 compiler
Personal Perl 6 compilerPersonal Perl 6 compiler
Personal Perl 6 compiler
Andrew Shitov
 

More from Andrew Shitov (20)

Perl6 one-liners
Perl6 one-linersPerl6 one-liners
Perl6 one-liners
 
Creating a compiler in Perl 6
Creating a compiler in Perl 6Creating a compiler in Perl 6
Creating a compiler in Perl 6
 
Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
AllPerlBooks.com
AllPerlBooks.comAllPerlBooks.com
AllPerlBooks.com
 
Perl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingPerl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel Computing
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
 
YAPC::Europe 2013
YAPC::Europe 2013YAPC::Europe 2013
YAPC::Europe 2013
 
Perl 7, the story of
Perl 7, the story ofPerl 7, the story of
Perl 7, the story of
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
 
What's new in Perl 5.14
What's new in Perl 5.14What's new in Perl 5.14
What's new in Perl 5.14
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 
Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6
 
There's more than one way to empty it
There's more than one way to empty itThere's more than one way to empty it
There's more than one way to empty it
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
 
How to clean an array
How to clean an arrayHow to clean an array
How to clean an array
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Say Perl на весь мир
Say Perl на весь мирSay Perl на весь мир
Say Perl на весь мир
 
Personal Perl 6 compiler
Personal Perl 6 compilerPersonal Perl 6 compiler
Personal Perl 6 compiler
 

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

  • 2. — Зачем знать про Go? — Откуда про него узнать? — Зачем нужен Go?
  • 3.
  • 8.
  • 9.
  • 10.
  • 12. Дух перла (совсем немного) душок :-)
  • 14. UTF-8 всегда и везде Даже в именах переменных
  • 15. UTF-8 всегда и везде Даже в именах переменных Perl 6!
  • 23. « The Go programming language is an open source project to make programmers more productive.»
  • 24. « Perl is a general-purpose programming language originally developed for text manipulation »
  • 25. « Go is expressive, concise, clean, and efficient. »
  • 26. « The language is intended to be practical <. . .> rather than beautiful »
  • 31.
  • 33. Ни на что не похожие интерфейсы
  • 34. Нет ООП и наследования
  • 35. В начале 2012 обещают GO 1.0
  • 36. В GO 1.0 зафиксируют синтаксис
  • 37. Не все старые программы работают в новых релизах Go
  • 38. Не все старые программы работают в новых релизах Go Perl 6!
  • 41. 01-­‐hello.go interface.go q3.go addr_in_noninit.go interface_vars.go q4-­‐2.go array.go iota.go q4-­‐4.go assign-­‐new.go iota_print-­‐1.go q4.go blank.go iota_print-­‐2.go q6.go channel.go iota_print.go q7.go close_channel.go len.go q9.go complex.go map.go random-­‐select.go copy-­‐array.go map_autovivif.go range-­‐string.go db.go map_non_existent.go range.go defer-­‐func.go mul_int64.go receiver.go defer.go openfile.go recover.go dial.go panic.go reslice.go echo.go pointer.go sort-­‐delay-­‐1.go even-­‐use.go pp.go sort-­‐delay.go even.go println.go sort.go factorial.go q10.go string_range.go fmt.go q11.go struct.go goroutine.go q12.go switch.go import_.go q12a.go type-­‐struct.go init.go q2-­‐2.go var.go int_method.go q2-­‐3.go variadic.go
  • 43. package  main import  "fmt" func  main()  {      fmt.Println("Hello,  World!") }
  • 45. Java class  HelloWorld  {        static  public        void  main(String  args[])  {                System.out.println(                      "Hello,  World!"                );        } }
  • 46. C++ #include<iostream> int  main()  {        std::cout  <<  "Hello,  World!n";        return  0; }
  • 47. Go package  main import  "fmt" func  main()  {      fmt.Println("Hello,  World!") }
  • 48. package  main import  "fmt" func  main()  {      fmt.Println("Hello,  World!") }
  • 49. ;
  • 50. package  main import  "fmt" func  main()  {      fmt.Println("Hello,  World!") }
  • 51. package  main; import  "fmt"; func  main()  {      fmt.Println("Hello,  World!"); }
  • 52. package  main; import  "fmt"; func  main()  {      fmt.Println("Hello,  World!"); }
  • 53. package  main; import  "fmt"; func  main()  {      fmt.Println("Hello,  World!"); }
  • 54. f()
  • 55. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1) }
  • 56. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1) }
  • 57. func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1) }
  • 58. Go func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1) }
  • 59. C++ int  factorial(n  int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1) }
  • 60. :=
  • 63. bool string int    int8    int16    int32    int64 uint  uint8  uint16  uint32  uint64   uintptr float32  float64 complex64  complex128
  • 64. func  main()  {        for  c  :=  0;  c  !=  10;  c++  {            fmt.Printf(                "%d!  =  %dn",                c,  factorial(c))        } }
  • 66. var  x  int  =  10
  • 67.        x  :=  10
  • 68. var  x  int  =  10        x  :=  10 Одно и то же
  • 69. defer
  • 71. func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("an")                return }
  • 72. func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("an")                return } a Before  1 Before  2
  • 73. range
  • 75. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        } }
  • 76. _
  • 78. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        } }
  • 79. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        } }
  • 80. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        } } range.go:5:  k  declared  and  not  used
  • 81. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  _,  v  :=  range  list  {                println(v)        } }
  • 83. package  main func  main()  {        var  list  =  []string{"a",  "b"}        for  _,  v  :=  range  list  {                println(v)        } } Struct literal
  • 88. type  I  interface  {        Get()  int        Set(int) }
  • 89. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get()) }
  • 90. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get()) }
  • 91. type  s  struct  {        i  int }
  • 92. func  (x  *s)  Get()  int  {        return  x.i } func  (x  *s)  Set(i  int)  {        x.i  =  i }
  • 93. func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%vn",  x.Get()) }
  • 94. func  main()  {        var  y  s        assign_and_print(&y,  42) }
  • 96. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil) }
  • 97. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil) }
  • 98. 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        } }
  • 99. 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        } }
  • 100. 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 }
  • 101. 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 }
  • 102. type  Page  struct  {        Title  string        Body  []byte }
  • 103. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil) }
  • 104. 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) }
  • 105. func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil) }
  • 106. 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) }
  • 107. 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) }
  • 108. func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600) }
  • 109. func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600) } p.save()
  • 110. — Параллельность — Обмен данными между потоками
  • 111. Горутины и каналы
  • 115. #!/bin/bash function  f()  {        sleep  "$1"        echo  "$1" } while  [  -­‐n  "$1"  ] do        f  "$1"  &        shift done wait
  • 116. 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)          } }
  • 117. 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)          } }
  • 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. var  get_value  chan  int        get_value  =  make(chan  int)
  • 120. var  get_value  chan  int        get_value  =  make(chan  int) get_value  <-­‐  x Запись в канал
  • 121. var  get_value  chan  int        get_value  =  make(chan  int) get_value  <-­‐  x Запись в канал y  :=  <-­‐  get_value Чтение из канала
  • 122. go  f(x,  y,  z)
  • 123. 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)          } }
  • 124. 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)          } }
  • 125. 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)          } }
  • 126. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x }
  • 127. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x }
  • 128. func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x }
  • 130. golang.org/pkg archive/tar exec net archive/zip exp/regex os/* big flag path/filepath bufio fmt rpc bytes go/* runtime/* cmath hash/* smtp compress/* http/cgi sort container/* http/fcgi testing/* crypto/* image/* time debug io/ioutil unicode ebnf log websocket encoding mail xml
  • 131. code.google.com/p/* github.com/*
  • 132. Все тесты к этой презентации: github.com/ash/go-tests Андрей Шитов andy@shitov.ru