Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GoLang & GoatCore

277 views

Published on

Sebastian Pożoga
Z komputerami miałem styczność, odkąd pamiętam. Od początku moje zainteresowania podzielone były między elektronikę a programowanie. Poświęciłem się drugiemu. Jednak rozwój mikrokomputerów pozwolił mi przypomnieć sobie o starej pasji. Jestem organizatorem HardGroup, Poznańskiej społeczności osób hobbystycznie i zawodowo się elektroniką i majsterkowaniem. Organizujemy darmowe spotkania i warsztaty, na które serdecznie zapraszam. Po pracy rozwijam własne projekt. Odwiedzam liczne imprezy edukacyjne i konferencje. Prowadzę bloga. Jestem dumny, że pomagam rozwijać pasję innym.

Temat prelekcji: GOLang & GoatCore
GOLang to nowy język Google. Już prawie od 10-lecia rozwijany i promowany przez firmę. Podczas prezentacji opowiem, jakie ma mocne strony. Ile nauczyłem się, rozwijając projekt Open Source w GO i dlaczego mi się tak podoba. Podczas prezentacji omówię, dlaczego powstał GoatCore, jak działa i kiedy nam pomaga. Omówię różne elementy języka. Poruszę temat współbieżności, optymalizacji pamięci, dependency injection, optymalizacji. Prezentacja jest przeznaczona dla doświadczonych programistów, którzy w stopniu co najmniej dobrym znają inny język programowania, narzędzia i wzorce projektowe. Omówię specyfikę języka i charakterystyczne cechy. Jednak skupiać się będę na konkretnych problemach i rozwiązaniach.

GoatCore źródło: github.com/goatcms/goatcore

  • Be the first to comment

  • Be the first to like this

GoLang & GoatCore

  1. 1. GOLang & GoatCore
  2. 2. Dlaczego powstał?
  3. 3. Jak zacząć
  4. 4. Krok 1 ● Zainstaluj mingw64 ● C_INCLUDE_PATH ● PATH C:Program Filesmingw-w64x86_64-6.3.0-posix-seh-rt_v5-rev1mingw64include C:Program Filesmingw-w64x86_64-6.3.0-posix-seh-rt_v5-rev1mingw64libgccmingw324.5.1include C:Program Filesmingw-w64x86_64-6.3.0-posix-seh-rt_v5-rev1mingw64bin C:Program Filesmingw-w64x86_64-6.3.0-posix-seh-rt_v5-rev1mingw64libexecgccx86_64-w64-mingw326.2.0
  5. 5. Krok 2 ● Zainstaluj golang ● Zainstaluj git ● Zainstaluj atom ● Zainstaluj go-plus plugin (do atoma) ● Zainstaluj postgresa (lub inną bazę w zależności od projektu) ● Zainstaluj delve ● Zainstaluj npm, yarn...
  6. 6. Krok 3 ● Zainstaluj biblioteki dla atoma > go get -u golang.org/x/tools/cmd/goimports > go get -u golang.org/x/tools/cmd/gorename > go get -u github.com/sqs/goreturns > go get -u github.com/nsf/gocode > go get -u github.com/alecthomas/gometalinter > go get -u github.com/zmb3/gogetdoc > go get -u github.com/rogpeppe/godef > go get -u golang.org/x/tools/cmd/guru
  7. 7. Krok 4 ● Pobieramy projekt > git clone github.com/goatcms/goatcore > git clone github.com/goatcms/goatcms
  8. 8. Krok 5 ● Pobieramy projekt > cd github.com/goatcms/goatcms > go run ./main.go run --loglvl=dev
  9. 9. Jak zacząć szybciej
  10. 10. Pobieramy i odpalamy ● Pobieramy github.com/goatcms/goatcms/devops/devtools ● Odpalamy > docker-compose up > git clone https://github.com/goatcms/goatcms.git
  11. 11. Czas na demo
  12. 12. Budowanie
  13. 13. Pobieramy i odpalamy ● Odpalamy ● Budujemy #1 > go build .main.go > go run ./main.go run --loglvl=dev
  14. 14. Pobieramy i odpalamy ● Budujemy #2 ● Budujemy #3 > GOARM=6 GOARCH=arm GOOS=linux go build examples/raspi_blink.go > go build -ldflags "-w" .main.go
  15. 15. Dlaczego go jest odjechany
  16. 16. “Concurrency Is Not Parallelism” - Rob Pike
  17. 17. Kanały package main import "fmt" func main() { ch := make(chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch) }
  18. 18. Kanał & runtime func fibonacci(n int, c chan int) { x, y := 0, 1 for i := 0; i < n; i++ { c <- x x, y = y, x+y } close(c) } func main() { c := make(chan int, 10) go fibonacci(cap(c), c) for i := range c { fmt.Println(i) } }
  19. 19. Select func main() { tick := time.Tick(100 * time.Millisecond) boom := time.After(500 * time.Millisecond) for { select { case <-tick: fmt.Println("tick.") case <-boom: fmt.Println("BOOM!") return default: fmt.Println(" .") time.Sleep(50 * time.Millisecond) } } }
  20. 20. GoatCore
  21. 21. … iteracja po plikach fsloop.NewLoop(&fsloop.LoopData{ Filespace: fs, FileFilter: func(fs filesystem.Filespace, subPath string) bool { return strings.HasSuffix(subPath, ".json") }, OnFile: func(fs filesystem.Filespace, subPath string) error { data, err := fs.ReadFile(subPath) if err != nil { return err } tmap := map[string]string{} if err = LoadJSON("", tmap, data); err != nil { return err } i18.Set(tmap) return nil }, }, scope).Run(basePath)
  22. 22. … iteracja po plikach func LoadJSON(resultKey string, result map[string]string, data []byte) error { return jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error { var newResultKey string if resultKey != "" { newResultKey = resultKey + "." + string(key) } else { newResultKey = string(key) } switch dataType { case jsonparser.Object: return LoadJSON(newResultKey, result, value) case jsonparser.String: result[newResultKey] = string(value) } return nil }) }
  23. 23. What makes it so fast? ● It does not rely on encoding/json, reflection or interface{}, the only real package dependency is bytes. ● Operates with JSON payload on byte level, providing you pointers to the original data structure: no memory allocation. ● No automatic type conversions, by default everything is a []byte, but it provides you value type, so you can convert by yourself (there is few helpers included). ● Does not parse full record, only keys you specified - buger/jsonparser
  24. 24. Testujemy ● Testy jednostkowe ● Testy wydajnościowe > go test -v github.com/goatcms/goatcore/... > cd github.com/goatcms/goatcore/i18n/fsi18loader > go test --bench=Linear --cpu=1,2,3,4,5,6,7,8,9,10
  25. 25. Pytania?
  26. 26. GoatCore https://github.com/goatcms/goatcore
  27. 27. Dziękuję za uwagę

×