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

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

description

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

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

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

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

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

— Зачем знать про Go?— Откуда про него узнать?— Зачем нужен Go?

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

Почему Goна Perl-мероприятии?

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

Кругозор

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

Тренды

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

XXI век

Page 8: Язык программирования Go для Perl-программистов
Page 9: Язык программирования Go для Perl-программистов
Page 10: Язык программирования Go для Perl-программистов
Page 11: Язык программирования Go для Perl-программистов

Дух перла (совсем немного)

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

Дух перла (совсем немного)

душок :-)

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

UTF-8всегда и везде

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

UTF-8всегда и везде

Даже в именах переменных

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

UTF-8всегда и везде

Даже в именах переменных

Perl 6!

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

return  a,  b

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

return  a,  b

Perl!

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

golang.org

Написан на Go

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

tour.golang.org

Есть офлайновая версия

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

goprogrammingbook.com

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

Март 2012

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

Локальный golang.org

$  godoc  -­‐http=:6060

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

The Go programming language is an open source project to make programmers more productive.

«

»

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

Perl is a general-purpose programming language originally developed for text manipulation

«

»

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

Go is expressive, concise, clean, and efficient.

«»

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

The language is intended to be practical <. . .> rather than beautiful

«»

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

Go — компилируемый

язык

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

Go — быстрокомпилируемый

язык

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

C-подобный синтаксис

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

Скорость компиляцииопределяет синтаксис

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

Встроенный сборщик мусора

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

Ни на что не похожие интерфейсы

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

Нет ООП и наследования

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

В начале 2012обещают

GO 1.0

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

В GO 1.0 зафиксируют синтаксис

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

Не все старые программы работают в новых релизах Go

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

Не все старые программы работают в новых релизах Go

Perl 6!

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

— Синтаксис— Интерфейсы

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

Синтаксис

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

01-­‐hello.goaddr_in_noninit.goarray.goassign-­‐new.goblank.gochannel.goclose_channel.gocomplex.gocopy-­‐array.godb.godefer-­‐func.godefer.godial.goecho.goeven-­‐use.goeven.gofactorial.gofmt.gogoroutine.goimport_.goinit.goint_method.go

interface.gointerface_vars.goiota.goiota_print-­‐1.goiota_print-­‐2.goiota_print.golen.gomap.gomap_autovivif.gomap_non_existent.gomul_int64.goopenfile.gopanic.gopointer.gopp.goprintln.goq10.goq11.goq12.goq12a.goq2-­‐2.goq2-­‐3.go

q3.goq4-­‐2.goq4-­‐4.goq4.goq6.goq7.goq9.gorandom-­‐select.gorange-­‐string.gorange.goreceiver.gorecover.goreslice.gosort-­‐delay-­‐1.gosort-­‐delay.gosort.gostring_range.gostruct.goswitch.gotype-­‐struct.govar.govariadic.go

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

Hello, World!

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

package  main

import  "fmt"

func  main()  {      fmt.Println("Hello,  World!")}

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

Многабукаф?

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

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

Java

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

#include<iostream>

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

C++

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

package  main

import  "fmt"

func  main()  {      fmt.Println("Hello,  World!")}

Go

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

package  main

import  "fmt"

func  main()  {      fmt.Println("Hello,  World!")}

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

;

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

package  main

import  "fmt"

func  main()  {      fmt.Println("Hello,  World!")}

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

package  main;

import  "fmt";

func  main()  {      fmt.Println("Hello,  World!");}

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

package  main;

import  "fmt";

func  main()  {      fmt.Println("Hello,  World!");}

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

package  main;

import  "fmt";

func  main()  {      fmt.Println("Hello,  World!");}

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

f()

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

func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}

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

func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}

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

func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}

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

func  factorial(n  int)  (int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}

Go

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

int  factorial(n  int)  {        if  (n  <  2)  {                return  1        }                return  n  *  factorial(n  -­‐  1)}

C++

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

:=

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

:=Да-да, навеяно Паскалем

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

«Динамические типы»

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

bool

string

int    int8    int16    int32    int64uint  uint8  uint16  uint32  uint64  uintptr

float32  float64

complex64  complex128

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

func  main()  {        for  c  :=  0;  c  !=  10;  c++  {            fmt.Printf(                "%d!  =  %d\n",                c,  factorial(c))

       }}

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

var  x  int

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

var  x  int  =  10

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

       x  :=  10

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

var  x  int  =  10

       x  :=  10

Одно и то же

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

defer

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

«Стек  блоков  END»

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

func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("a\n")                return}

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

func  d()  {        defer  fmt.Println("Before  2")        defer  fmt.Println("Before  1")                fmt.Printf("a\n")                return}

aBefore  1Before  2

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

range

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

each  в  перле

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

package  main

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

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

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

_

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

Это не $_

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

package  main

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

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

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

package  main

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

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

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

package  main

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

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

range.go:5:  k  declared  and  not  used

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

package  main

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

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

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

Похоже на (undef,  $v)  =  @list;

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

package  main

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

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

Struct literal

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

Интерфейсы

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

Нет классов

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

Нет наследования

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

Есть методы

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

type  I  interface  {        Get()  int        Set(int)}

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

func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%v\n",  x.Get())}

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

func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%v\n",  x.Get())}

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

type  s  struct  {        i  int}

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

func  (x  *s)  Get()  int  {        return  x.i}

func  (x  *s)  Set(i  int)  {        x.i  =  i}

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

func  assign_and_print(x  I,  v  int)  {        x.Set(v)        fmt.Printf("%v\n",  x.Get())}

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

func  main()  {        var  y  s        assign_and_print(&y,  42)}

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

Пример 1

Wiki

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

func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}

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

func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}

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

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        }}

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

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        }}

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

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}

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

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}

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

type  Page  struct  {        Title  string        Body  []byte}

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

func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}

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

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)}

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

func  main()  {        http.HandleFunc("/view/",  viewHandler)        http.HandleFunc("/edit/",  editHandler)        http.HandleFunc("/save/",  saveHandler)                http.ListenAndServe(":8080",  nil)}

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

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)}

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

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)}

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

func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600)}

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

func  (p  *Page)  save()  os.Error  {        filename  :=  p.Title  +  ".txt"        return  ioutil.WriteFile(filename,                                                          p.Body,  0600)}

p.save()

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

— Параллельность— Обмен данными между потоками

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

Горутиныи

каналы

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

-­‐>

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

<-­‐

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

Пример 2

Sleep sort

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

#!/bin/bashfunction  f()  {        sleep  "$1"        echo  "$1"}while  [  -­‐n  "$1"  ]do        f  "$1"  &        shiftdonewait

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

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)          }}

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

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)          }}

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

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)          }}

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

var  get_value  chan  int

       get_value  =  make(chan  int)

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

var  get_value  chan  int

       get_value  =  make(chan  int)

get_value  <-­‐  x Запись в канал

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

var  get_value  chan  int

       get_value  =  make(chan  int)

get_value  <-­‐  x Запись в канал

y  :=  <-­‐  get_value Чтение из канала

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

go  f(x,  y,  z)

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

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)          }}

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

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)          }}

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

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)          }}

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

func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}

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

func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}

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

func  send_value(x  int)  {          time.Sleep(int64(x)  *  1E8)          get_value  <-­‐  x}

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

— Стандартные модули— «CPAN»

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

golang.org/pkgarchive/tararchive/zipbigbufiobytescmathcompress/*container/*crypto/*debugebnfencoding

execexp/regexflagfmtgo/*hash/*http/cgihttp/fcgiimage/*io/ioutillogmail

netos/*path/filepathrpcruntime/*smtpsorttesting/*timeunicodewebsocketxml

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

code.google.com/p/*

github.com/*

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

Андрей Шитов [email protected]

Все тесты к этой презентации:github.com/ash/go-tests