• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Язык программирования Go для Perl-программистов
 

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

on

  • 2,514 views

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

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

Statistics

Views

Total Views
2,514
Views on SlideShare
2,514
Embed Views
0

Actions

Likes
5
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Язык 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 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
    • Hello, World!
    • package  mainimport  "fmt"func  main()  {      fmt.Println("Hello,  World!")}
    • Многабукаф?
    • Javaclass  HelloWorld  {        static  public        void  main(String  args[])  {                System.out.println(                      "Hello,  World!"                );        }}
    • 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        }                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)}
    • Gofunc  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)}
    • :=
    • :=Да-да, навеяно Паскалем
    • «Динамические типы»
    • boolstringint    int8    int16    int32    int64uint  uint8  uint16  uint32  uint64  uintptrfloat32  float64complex64  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  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        }}
    • _
    • Это не $_
    • package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(k,  v)        }}
    • package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        }}
    • package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  k,  v  :=  range  list  {                println(v)        }}range.go:5:  k  declared  and  not  used
    • package  mainfunc  main()  {        var  list  =  []string{"a",  "b"}        for  _,  v  :=  range  list  {                println(v)        }}
    • Похоже на(undef,  $v)  =  @list;
    • package  mainfunc  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()
    • — Параллельность— Обмен данными между потоками
    • Горутины и каналы
    • -­‐>
    • <-­‐
    • Пример 2Sleep sort
    • #!/bin/bashfunction  f()  {        sleep  "$1"        echo  "$1"}while  [  -­‐n  "$1"  ]do        f  "$1"  &        shiftdonewait
    • 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/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
    • code.google.com/p/* github.com/*
    • Все тесты к этой презентации: github.com/ash/go-tests Андрей Шитов andy@shitov.ru