Slide 1

Slide 1 text

Go 101 jobandtalent.com, November 2015 Álex González

Slide 2

Slide 2 text

Some history Designed by: Robert Griesemer, Rob Pike & Ken Thompson 6 years ago At Google To improve C++ And because they hated it

Slide 3

Slide 3 text

Why Go? Asynchronous concurrency as part of the language Compiled to a single binary Garbage collected Fast Go tools!

Slide 4

Slide 4 text

Why NOT Go? Libraries not always as mature, but improving! No generics... is that a real problem? Dependency management

Slide 5

Slide 5 text

Your first program p a c k a g e m a i n i m p o r t " f m t " f u n c m a i n ( ) { f m t . P r i n t l n ( " H i w o r l d ! " ) } Run

Slide 6

Slide 6 text

Hands on!

Slide 7

Slide 7 text

types { u , } i n t { , 8 , 1 6 , 3 2 , 6 4 } f l o a t { 3 2 , 6 4 } c o m p l e x { 6 4 , 1 2 8 } b o o l b y t e r u n e "Code point" in Unicode (item represented by a single value). s t r i n g

Slide 8

Slide 8 text

More types a r r a y s An array type definition specifies a length and an element type. s l i c e s A slice is a data structure describing a contiguous section of an array stored separately from the slice variable itself. A slice is not an array. A slice describes a piece of an array. m a p s Key/value storage.

Slide 9

Slide 9 text

Moarrrrr types s t r u c t s p o i n t e r s f u n c t i o n s i n t e r f a c e s t y p e j o b A n d T a l e n t s t r u c t { e m p l o y e e s i n t } f u n c m a i n ( ) { j t : = j o b A n d T a l e n t { e m p l o y e e s : 2 , } f m t . P r i n t l n ( j t . e m p l o y e e s ) } Run

Slide 10

Slide 10 text

THE Type c h a n "A channel can be imagined to be a pipe or a conveyer belt of a defined size and capacity. On one side one can place an item onto this imaginary conveyer belt and on the other side one can take it."

Slide 11

Slide 11 text

Let's the magic begin

Slide 12

Slide 12 text

Your second program p a c k a g e m a i n f u n c m a i n ( ) { v a r s s t r i n g = " h i " / / N o t s t y l i s h e n o u g h f o r v e t v a r s 2 s t r i n g s 2 = " t h e r e " v a r s 3 = " j o b a n d t a l e n t " s 4 : = " f o l k s " p r i n t l n ( s , s 2 , s 3 , s 4 ) } Run

Slide 13

Slide 13 text

Named errors v a r N a m e d E r r o r = e r r o r s . N e w ( " I s t h i s a n e x c e p t i o n ? " ) f u n c b r e a k S o m e t h i n g ( ) e r r o r { r e t u r n N a m e d E r r o r } f u n c m a i n ( ) { e r r : = b r e a k S o m e t h i n g ( ) s w i t c h e r r { c a s e N a m e d E r r o r : l o g . P r i n t l n ( " F a i l e d a s e x p e c t e d " ) d e f a u l t : l o g . P a n i c ( " I d i d n ' t e x p e c t t h i s ! " ) } i f e r r : = b r e a k S o m e t h i n g ( ) ; e r r = = N a m e d E r r o r { l o g . P r i n t l n ( " T h i s f a i l e d a s e x p e c t e d a s w e l l ! " ) } } Run

Slide 14

Slide 14 text

JSON t y p e P e r s o n s t r u c t { N a m e s t r i n g ` j s o n : " n a m e " ` } f u n c m a i n ( ) { v a r s e n t P e o p l e = [ ] P e r s o n { P e r s o n { " M i h a i " } , P e r s o n { " A l e x " } } p a y l o a d , e r r : = j s o n . M a r s h a l ( s e n t P e o p l e ) i f e r r ! = n i l { l o g . P a n i c ( e r r ) / / D o n ' t d o t h i s a t h o m e } f m t . P r i n t l n ( s t r i n g ( p a y l o a d ) ) v a r r e c e i v e d P e o p l e [ ] P e r s o n i f e r r : = j s o n . U n m a r s h a l ( p a y l o a d , & r e c e i v e d P e o p l e ) ; e r r ! = n i l { l o g . P a n i c ( e r r ) } f o r _ , p : = r a n g e r e c e i v e d P e o p l e { f m t . P r i n t l n ( p . N a m e ) } } Run

Slide 15

Slide 15 text

Type switch f u n c o u t p u t ( w h a t e v e r i n t e r f a c e { } ) { s w i t c h v : = w h a t e v e r . ( t y p e ) { c a s e s t r i n g : f m t . P r i n t l n ( " A S t r i n g : " , v ) c a s e i n t : f m t . P r i n t l n ( " S o m e i n t : " , v ) d e f a u l t : f m t . P r i n t l n ( " I d o n ' t k n o w w h a t t y p e i s t h i s o n e : " , v ) } } f u n c m a i n ( ) { o u t p u t ( " t h i s i s s o m e t e x t " ) o u t p u t ( 1 ) o u t p u t ( 1 . 1 ) } Run

Slide 16

Slide 16 text

The good one about interfaces! t y p e D e v e l o p e r i n t e r f a c e { L i k e s D e v e l o p m e n t ( ) b o o l } t y p e ( G o o d D e v s t r u c t { } M e r c e n a r y D e v s t r u c t { } ) f u n c ( M e r c e n a r y D e v ) L i k e s D e v e l o p m e n t ( ) b o o l { r e t u r n f a l s e } f u n c ( G o o d D e v ) L i k e s D e v e l o p m e n t ( ) b o o l { r e t u r n t r u e } f u n c C o u l d W o r k H e r e ( d D e v e l o p e r ) b o o l { r e t u r n d . L i k e s D e v e l o p m e n t ( ) } f u n c m a i n ( ) { f m t . P r i n t l n ( C o u l d W o r k H e r e ( G o o d D e v { } ) , C o u l d W o r k H e r e ( M e r c e n a r y D e v { } ) ) } Run

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Concurrency f u n c m a i n ( ) { f o r i : = 0 ; i < 1 0 ; i + + { g o f m t . P r i n t l n ( i ) } / / S o m e t h i n g i s g o i n g t o g o w r o n g . . . } Run

Slide 19

Slide 19 text

... patterns f u n c d o i t ( i i n t , d o n e c h a n b o o l ) { t i m e . S l e e p ( t i m e . D u r a t i o n ( r a n d . I n t n ( 3 ) ) * t i m e . S e c o n d ) f m t . P r i n t l n ( i ) d o n e < - t r u e } f u n c m a i n ( ) { d o n e : = m a k e ( c h a n b o o l , 1 ) f o r i : = 0 ; i < 1 0 ; i + + { g o d o i t ( i , d o n e ) } f o r i : = 0 ; i < 1 0 ; i + + { s e l e c t { c a s e < - d o n e : c o n t i n u e c a s e < - t i m e . A f t e r ( t i m e . S e c o n d * 3 ) : l o g . P r i n t l n ( " T o o . . . m u c h . . . w a i t i n g . . . " ) r e t u r n } } } Run

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

... and more patterns f u n c m a i n ( ) { v a r w g s y n c . W a i t G r o u p f o r i : = 0 ; i < 1 0 ; i + + { w g . A d d ( 1 ) g o f u n c ( i i n t ) { f m t . P r i n t l n ( i ) w g . D o n e ( ) } ( i ) } w g . W a i t ( ) } Run

Slide 22

Slide 22 text

OMG

Slide 23

Slide 23 text

Channels f u n c f i l l ( q u e u e c h a n < - P e r s o n , w g * s y n c . W a i t G r o u p ) { d e f e r c l o s e ( q u e u e ) d e f e r w g . D o n e ( ) f o r _ , n a m e : = r a n g e [ ] s t r i n g { " M i h a i " , " V i c t o r " , " F r a n c e s c " , " G e r m á n " , " A l e x " } { q u e u e < - P e r s o n { n a m e } t i m e . S l e e p ( t i m e . D u r a t i o n ( r a n d . I n t n ( 1 0 0 0 ) ) * t i m e . M i l l i s e c o n d ) } } f u n c v i s i t ( q u e u e < - c h a n P e r s o n , w g * s y n c . W a i t G r o u p ) { d e f e r w g . D o n e ( ) f o r p : = r a n g e q u e u e { f m t . P r i n t l n ( p . N a m e , " i s v i s i t i n g " ) } } f u n c m a i n ( ) { q u e u e : = m a k e ( c h a n P e r s o n , 2 ) / / . . . Run

Slide 24

Slide 24 text

Your own server v a r ( c o u n t e r i n t p o r t = 9 0 0 0 ) f u n c c o u n t ( w h t t p . R e s p o n s e W r i t e r , r * h t t p . R e q u e s t ) { c o u n t e r + + } f u n c s t a t s ( w h t t p . R e s p o n s e W r i t e r , r * h t t p . R e q u e s t ) { w . W r i t e ( [ ] b y t e ( f m t . S p r i n t f ( " V i s i t s : % d " , c o u n t e r ) ) ) } f u n c m a i n ( ) { / / h t t p . H a n d l e F u n c ( " / f a v i c o n . i c o " , f u n c ( _ h t t p . R e s p o n s e W r i t e r , _ * h t t p . R e q u e s t ) { } ) h t t p . H a n d l e F u n c ( " / " , c o u n t ) h t t p . H a n d l e F u n c ( " / s t a t s " , s t a t s ) l o g . P r i n t l n ( " L i s t e n i n g a t p o r t " , p o r t ) l o g . P a n i c ( h t t p . L i s t e n A n d S e r v e ( f m t . S p r i n t f ( " : % d " , p o r t ) , n i l ) ) } Run

Slide 25

Slide 25 text

Thank you Álex González agonzalezro@gmail.com (mailto:agonzalezro@gmail.com) http://agonzalezro.github.io (http://agonzalezro.github.io) @agonzalezro (http://twitter.com/agonzalezro)

Slide 26

Slide 26 text

No content