Golang intro

2013, Michelberger Tamás
Kir-Dev

Tartalom

  1. Történet
  2. Szintaxis
  3. OO
  4. Goroutine-ok
  5. Runtime

Történet

Google

Robert Griesemer

Rob Pike

Ken Thompson

Célok

  • egyszerűség
  • olvashatóság és egyértelműség
  • gyors fordítás
  • egyszerű kódmegosztás
  • C-szerű szintaxis

Szintaxis

C

Kapcsos zárójel mindenhol


func main() {
	fmt.Println("Hello world")
}

C

Hasonló kulcsszavak

int, string, for, if, []byte, //

C

Pointerek

a := 3 // a compiler okos és kitalálja, hogy 'a' int lesz
var b *int = &a

C

Struktúrák


type Point struct {
	X int
	Y int
}

p1 := Point{1, 1}
p2 := Point{X: 4, Y: 10}

Nem C

Nem kell pontosvessző.

Pontosabban a compiler beilleszti helyettünk a megfelelő helyekre.

Nem C

Névterek

package-ek formájában

minden fájl elején

Nem C

Függvények


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

func div(a, b int) (int, int) {
	res := a / b
	mod := a % b
	return res, mod
}

type HandlerFunc func(ResponseWriter, *Request)

Nem C

Szigorú típusosság


var a int32 = 0
var b int64 = a // fordítás idejű hiba
var b int64 = int64(a) // ez már megy
					

(G)OO

Objektumok osztályok nélkül

Metódusok

Minden általunk deklarált típusra
aggathatunk metódusokat.


type Point struct { X,Y int }

func (p Point) Length() float64 {
	length := ...

	return length
}
					

Interfészek

Polimorfizmus


type Abser interface {
    Abs() float64
}
					

Interfészek


type myFloat float64

func (f myFloat) Abs() float64 {
	if f < 0 {
		return -1 * f
	}
	return f
}
					

Öröklés(féle)

A klasszikus öröklés nem létezik Go földön.

Helyette beágyazás van.

Öröklés(féle)

Névtelen mezőként adjuk meg.


type Point struct { X, Y int }
type Circle struct {
	Point
	R float64
}

c := Circle{Point{0,1}, 2}

					

Nézzük meg mozgásban!

Goroutine-ok

"Share by communicating"

Csatornák

Az adatok utaztatásának elsődleges módja.


ch := make(chan int)
ch <- 42
a := <-ch
					

Csatornák

select

Csatornák switch-case-e


select {
case res := <- done:
	// do amazing stuff
case <-timeout:
	// handle timeout
}					

Csatornák

for-range


for t := range time.Tick(1 * time.Second) {
	fmt.Println(t.Second())
}
					

Runtime

Natív, de mégsem annyira

Valóban natív binárissá fordul, de közben a runtime
mindig ott van a háttérben.


-rwxrwxr-x 1 tomi tomi 411K Nov 27 00:38 blank
-rwxrwxr-x 1 tomi tomi 1.5M Nov 27 00:42 helloworld
					

GC

Mark-and-sweep

Reflection

Futásidőben elérhetőek extra információk a típusokról.

Goroutine-ok

  • Green threads.
  • A runtime intézi a goroutine-ok ütemezését.
  • Nincs egy-egy leképzés OS szálakra.

Köszönöm!

Kérdések?