go meetup 2015 04-23
TRANSCRIPT
Go в Спутник.КартахВ бою
Go в Спутник.КартахВ бою
Тайловый бэкенд Gopnik =)
Тайловый бэкенд
- Карта состоит из тайлов
Тайловый бэкенд
Тайловый бэкенд
- Карта состоит из тайлов- Используются различные источники
данных
Тайловый бэкенд
Тайловый бэкенд
- Карта состоит из тайлов- Используются различные источники
данных- Используется специализированная
библиотека Mapnik (написана на C++)- Генерация тайлов занимает
существенное время
Тайловый бэкенд
- Часть тайлов генерируется заранее в пакетном режиме
- Часть - по требованию
Тайловый бэкенд
Open Source
http://sputnik-maps.github.io/
Поиск объектов реального мира
Особенности :-)
- Учитывает особенности строения адресного пространства (вложенность объектов)
- “Угадывает мысли” (учитывает подразумеваемый контекст)
- Различает “близко” и “далеко”, “большой” и “маленький”
Особенности :-(
- Много деталей, специфичных только для России
Обратный геокодер
- Преобразует координаты в адрес
- Используется порт библиотеки S2https://github.com/golang/geo
Архитектура
Архитектура
- Относительно небольшая коллекция данных (входит в оперативную память)
- Компоненты – простые веб-сервисы
- MVC-like
(✿◠‿◠)
Что нам дает Go
Что нам дает Go
- Скорость разработки
- Простота обучения
- Тестируемый код
Что нам дает Go
- Скорость выполнения
- Скорость компиляции
- Стандартная библиотека
- Tools
gofmt, gorename, cover, pprof, expvargotype, golint, vet, errcheck
Трудности(╯°□°)╯︵ ┻━┻
Gob
- gobhttp://blog.golang.org/gobs-of-datahttp://golang.org/pkg/encoding/gob
- не быстрый
- const tooBig = 1 << 30
Сторонние библиотеки
:-(- писать биндинги С++ ↔ Go непросто- segfault безжалостен
:-)- изолированные процессы- RPC
Данные в памяти и GC
- Хранишь миллионы объектов – GC придет за тобой
- длительность stop-the-world пропорциональна количеству указателей в heap
Данные в памяти и GC
Данные в памяти и GC
Где прячутся указатели
- указатели- мапы- слайсы- строки- интерфейсы- ...
Данные в памяти и GC
Как уменьшить длительность stop-the-world
- индекс массива вместо указателей
- строки положить в один большой []bytetype PString struct {
Offset: uint32
Lenghth: uint32
}
Данные в памяти и GC
Как уменьшить длительность stop-the-world
- mmap
- генерация кода с константамиvar data = map[string]int{
"a":1,
"b":2,
...
package mainimport "fmt"
func main() { c := []struct { name string email string }{ { name: "Константин Черкасов", email: "[email protected]", }, { name: "Максим Дементьев", email: "[email protected]", }, } fmt.Println(c)}