GO

2007 г.

2009 г.

до версии 1.3

в версии 1.4

Развитие Go

Простой и понятный синтаксис

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

Статическая типизация

var GoVar1 int                
var GoVar2 string             
var GoVar3 [10]int            
var GoVar4 []int              

 
package main

import "fmt"

func add(a, b int) int {
    return a + b
}

func main() {
	fmt.Println(add(2000, 15))
}

Функции

package main

import "fmt"

func vals() (int, int) {
    return 3, 7
}

func main() {
    a, b := vals()
    fmt.Println(a)
    fmt.Println(b)
}

Функции

ООП

  • Классы
  • Cтруктуры данных с методами

Структуры и интерфейсы

package main
import "fmt"
import "math"

type geometry interface {
    area() float64
}

type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}

func (r rect) area() float64 {
    return r.width * r.height
}

func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
}

func main() {
    r := rect{width: 3, height: 4}
    c := circle{radius: 5}

    measure(r)
    measure(c)
}

Скорость

Скорость

Скорость

package main
 
import "fmt"
import "time"
 
func main() {
 
    timestart := time.Now()
 
    for c := 0; c < 100000000; c++ {
        bubble()
    }
 
    timeend := time.Now();
 
    fmt.Print(timeend.Sub(timestart));
}
 
func bubble() {
    array := [...]int16{3,4,1,3,5,1,92,2,4124,424,52,12}
 
    for i := 0; i < len(array); i++ {
        for y := 0; y < len(array) - 1; y++ {
            if array[y+1] < array[y] {
                t := array[y]
                array[y] = array[y+1]
                array[y+1] = t
            }
        }
    }
}
var starttime = new Date().getTime();
 
for (var c = 0; c < 100000000; c++) {
    bubble();
}
 
function bubble() {
    var array = [3,4,1,3,5,1,92,2,4124,424,52,12];
    for (var i = 0; i < array.length; i++) {
        for (var y = 0; y < array.length - 1; y++) {
            if (array[y+1] < array[y]) {
                var t = array[y];
                array[y] = array[y + 1];
                array[y + 1] = t;
            }
        }
    }
}
 
console.log(new Date().getTime() - starttime);

Скорость

Многопоточность

package main

import "fmt"

func f(n int) {
    for i := 0; i < 10; i++ {
        fmt.Println(n, ":", i)
    }
}

func main() {
    go f(0)
    var input string
    fmt.Scanln(&input)
}

Многопоточность

Горутины
Горутины

Горутины очень легковесны

4 — 4,5 килобайт

Горутины

4 Gb 

800 тысяч работающих горутин

Горутины

Любители Erlang прямо сейчас)

Горутины

Другие фичи

  • Богатая стандартная библиотека
  • Есть возможность использовать библиотеки C и C++
  • Тесты

Web-разработка на Go

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World!!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

Web-разработка на Go

  • Bee Go
  • Martini
  • Revel
  • Gorilla
  • Pat

Martini

package main

import "github.com/go-martini/martini"

func main() {
  m := martini.Classic()
  m.Get("/", func() string {
    return "Hello world!"
  })
  m.Run()
}

Gorilla


func main() {
    r := pat.New()
    r.Get("/products", ProductsHandler)
    r.Get("/articles", ArticlesHandler)
    r.Get("/", HomeHandler)
    http.Handle("/", r)
}
“/:i”

Задача

Отдает i-тое число Фибоначчи

Hardware: Retina Macbook Pro i7@2.7GHz and 16GB RAM
Software: OSX 10.9.3
Java 8 + Sparkjava 2.0.0
Golang 1.3
Python 2.7.7 + Flask 0.10.1
PyPy 2.3.1 + Twisted 14.0.0
Node v0.10.29 + Express 4.4.4

Golang + bmizerany Pat + GOMAXPROCS(7)

51684 Requests/sec

Java + Spark 

48631 Requests/sec

PyPy2.7 Python + Twisted

12633 Requests/sec

Node + Express

8962 Requests/sec

Python + Flask

546 Requests/sec

Что мы получаем?

  • Легок в изучении
  • Скорость
  • Крутую многопоточность

Спасибо за внимание!

Цыркунов Даниил
email : danik.cyrkunov@gmail.com

facebook : facebook.com/danik.tsyrkunov

Go

By Danik Tsyrkunov