Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Gyimesi Gábor.  Google - 2009 november 10.  Célja: interpretált nyelvek dinamikusságának és fordított nyelvek biztonságának, teljesítményének ötvözése.

Hasonló előadás


Az előadások a következő témára: "Gyimesi Gábor.  Google - 2009 november 10.  Célja: interpretált nyelvek dinamikusságának és fordított nyelvek biztonságának, teljesítményének ötvözése."— Előadás másolata:

1 Gyimesi Gábor

2  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

3  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

4  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

5  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

6  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

7  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

8  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

9  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

10  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

11  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

12  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

13  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

14  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

15  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

16  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

17  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

18  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

19  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

20  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

21 Gyimesi Gábor21


Letölteni ppt "Gyimesi Gábor.  Google - 2009 november 10.  Célja: interpretált nyelvek dinamikusságának és fordított nyelvek biztonságának, teljesítményének ötvözése."

Hasonló előadás


Google Hirdetések