Gyimesi Gábor
Google november 10. Célja: interpretált nyelvek dinamikusságának és fordított nyelvek biztonságának, teljesítményének ötvözése Open Source, fordított Garbage collectorral rendelkezik Párhuzamos programozási lehetőségek Hierarchia mentes Ősei: C/C++/C#/Java, Pascal/Modula elemekkel Gyimesi Gábor2
Alapvetően C stílusú szintaxis ◦ C stílusú kommentek - // /* */ Terminálójel (;) lehet rejtett ◦ “if the newline comes after a token that could end a statement, insert a semicolon” ◦ break continue fallthrough return ) } package main //belépő main package import "fmt„ //import( // "fmt" // " math„ //) func main() { fmt.Println("Hello, 世界 ") //Hello, 世界 } Nem használt csomagok, változók warning helyett fordítási hibát adnak Gofmt – forrás formázásához Gyimesi Gábor3
bool //true false string //”stringliteral” int8 (alias: byte), int16, int32(alias: rune), int64 uint8, uint16, uint32, uint64 float32, float64 complex64, complex128 // i Implementációfüggő ◦ uint – 32 vagy 64 bites ◦ int – uint nagyságú ◦ intptr – pointer tárolására egész típus Gyimesi Gábor4
Struct-ok ◦ Rekord megvalósítása ◦ type kulcsszóval ◦ Tagok elérése „.” operátorral ◦ type [név] struct { [mezőnév] [típus] [mezőnév2] [típus2] … } ◦ type Point struct { X int Y int } Új típusok type kulcsszóval ◦ Type MyInt int var x MyInt = 1 Tömbök ◦ Érték szerint átadott gyűjtemény ◦ Pl.: x [10]int{1,2,3,4,5,6,7,8,9,10} //fix méretű ◦ 0-tól indexelődik ◦ len(x) Gyimesi Gábor5
Referencia szerint átadott gyűjtemény Nil slice deklaráció ◦ var z []int // == nil Allokáció ◦ „make” kulcsszóval – p := make([]int,10) ◦ v := Int[]{1,2,3} Slicing ◦ Részslice-ok lekérése s[lo:hi] szintaxissal ◦ p := []int{2, 3, 5, 7, 11, 13} v := p[1:4] // 3, 5, 7 w := p[:3] //2, 3, 5 x := p[4:] //11, 13 Gyimesi Gábor6
Beépített asszociatív gyűjtemény Allokáció „make”-kel ◦ p:=make(map[string]Point) Műveletek: m[key], elem = m[key]; delete(m,key); elem, ok = m[key]; Map literál: ◦ var m = map[string] Point{ "Bell Labs": Point { , , }, "Google": Point { , , }, } Gyimesi Gábor7
Var kulcsszó ◦ Var [változónév] {típus} ◦ Pl.: var x, y, z int ◦ Inicializáció: var x, y int = 1, 2 //int elhagyható ◦ var ( ToBe bool = false z complex128 = cmplx.Sqrt( i) ) ◦ Értékadás = operátorral ◦ Szimultán értékadás Pl.: a,b = 1,2 Konstans deklaráció ◦ const kulcsszóval ◦ const Pi float32 = 3.14 //float32 elhagyható ◦ const ( Big = 1 > 99 ) Rövid változó deklaráció ◦ Lokális változókhoz ◦ Csak akkor használható, ha egyik új változó ◦ := operátorral: x := true ◦ Szimultán értékadás: x, y, z := true, 1, „no” ◦ Minimum 1 új változó esetén Gyimesi Gábor8
Deklaráció és dereferencia * operátorral Allokáció new operátorral ◦ var i *int = new(int) Cím lekérése & operátorral ◦ var a *int = new(int) b := &a Függvénypointerek ◦ Változóknak értékül adhatók ◦ dist:= func(x1, y1, x2, y2 float64) float64 { return math.Sqrt(math.Pow(x1-x2,2) + math.Pow(y1-y2,2)) } dist(0,0,10,10) Gyimesi Gábor9
Elágazás ◦ C szintaxishoz hasonló (zárójelek elhagyva) ◦ Megengedett kezdeti utasítással ◦ if v := math.Pow(x, n); v < lim { return v } else { …} Switch ◦ Elágazáshoz hasonlóan C szintaxissal ◦ Használható vizsgált érték nélkül if-else ágak helyettesítésére ◦ switch { case t.Hour() < 12: fmt.Println("Good morning!") case t.Hour() < 17: fmt.Println("Good afternoon.") default: fmt.Println("Good evening.") } Gyimesi Gábor10
Számlálós ciklus ◦ sum := 0 for i := 0; i < 10; i++ { sum += i } Kezdeti értékadás elhagyható „While” ciklus csak feltételt meghagyva ◦ sum := 1 for sum < 1000 { sum += sum } „Forever” ◦ for { } „Foreach” ◦ var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() { for i, v := range pow { fmt.Printf("2**%d = %d\n", i, v) } Goto, Break, Continue Gyimesi Gábor11
Func kulcsszóval func [függvénynév] ([paraméterek]) ([visszatérési értékek]){} Rövidíthető paraméterek ◦ func add(x int,y int) -> func add(x,y int) Több visszatérési érték ◦ func swap(x, y string) (string, string) { return y, x } a,b := swap(„egy”,”ketto”) ◦ Csak egyes értékek eltárolásának lehetősége: _,b := swap(„egy”,”ketto”) Elnevezhető visszatérési értékek ◦ func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum – x return } Gyimesi Gábor12
Nincsenek osztályok Tagfüggvények társítása struct-okhoz ◦ A csomagban definiálhatunk függvényeket átadva a tagfüggvény típusát ◦ func (v *Point) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } ◦ Átadhatjuk a típust pointerként és statikus típusként is – érték vs referencia ◦ Pointeren és statikus típuson keresztül is elérhetjük a tagfüggvényeket a „.” operátor segítségével var v Point{2,2} var a *Point = &v func (v Point) Foo() { v.X++ } func (v *Point) Foo() { v.X++ } v.Foo() // v == {2,2} a.Foo() //v == {3,2} Tagfüggvények bármilyen típushoz ◦ type MyFloat float64 func (f MyFloat) Abs() float64 {…} Gyimesi Gábor13
A beágyazást részesíti előnyben a nyelv Nincs „az-egy” kapcsolat Többszörös öröklődés megengedett ◦ Kompozíciós megoldással type Parent struct { name string } type Child struct { Parent //AnotherParent } Gyimesi Gábor14
Függvényszignatúrák halmaza Konvencionálisan –er végűek Deklaráció ◦ type Abser interface { Abs() float64 } Polimorfizmus ◦ var a Abser f := MyFloat(-math.Sqrt2) v := Point{3, 4} a = f //Megvalósítja az Abs műveletet a = &v //*Point is megvalósítja az Abs műveletet Gyimesi Gábor15
Halasztható függvények Listára menti a függvényt Környező függvény végrehajtása után hajtódnak végre Clean up műveletek végrehajtására func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } defer src.Close() dst, err := os.Create(dstName) if err != nil { return } defer dst.Close() return io.Copy(dst, src) } Gyimesi Gábor16
Alapvetően a nyelv előnyben részesíti a hibakódokkal történő visszatérést Hiba interfész ◦ type error interface { Error() string } Panic/Recover ◦ Fatális hibák esetén használandó ◦ Panic Megszakítja a végrehajtást és elkezd a program „pánikolni” Lefuttatja az elhalasztott függvényeket ◦ Recover beépített függvény amely visszaadja a vezérlést a pánikoló szálnak Elhalasztott függvényekben érdemes meghívni Gyimesi Gábor17
Goroutine-ok ◦ Go egyszerű szálai ◦ „go” kulcsszóval új szálon indítja el a függvényt ◦ func say(s string) { fmt.Println(s) } func main() { go say("world") //új szálon say("hello") } ◦ Szinkronizáció „sync” csomagban wait, mutex, lock… Gyimesi Gábor18
Goroutine-ok közötti adatküldésre Bufferelhetőek FIFO Típusosak „make” kulcsszóval példányosítjuk ◦ c := make(chan int) ◦ c := make(chan int, 2) //legfeljebb 2 elemmel – cap(c) <- operátor elhelyezésre és kivételre ◦ Kivételkor 2. visszatérési érték – van-e még elem? close a csatorna lezárására Ciklusban feldolgozható c := make(chan int, 10) go fibonacci(cap(c), c) for i := range c { fmt.Println(i) } a,b := <-c fmt.Println(a,b) Gyimesi Gábor19
Select blokkol, amíg egy ága nem teljesül Amint teljesül egy ág lefuttatja azt Lehet egy default ágat definiálni, amely abban az esetben fut le, ha más feltétele nem teljesül tick := time.Tick(1e8) boom := time.After(5e8) for { select { case <-tick: fmt.Println("tick.") case <-boom: fmt.Println("BOOM!") return default: fmt.Println(".") time.Sleep(5e7) } } Gyimesi Gábor20
Gyimesi Gábor21