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.