Programovací jazyk Go je opensource projekt zameraný na zjednodušenie programovania. Go je expresívny, stručný, čistý a efektívny. Jeho súbežné mechanizmy umožňujú ľahko písať programy, ktoré využijú čo najviac z viacjadrových a sieťových zariadení, zatiaľ čo nový typ systému umožňuje flexibilné a modulárne budovanie programu. Go sa zostavuje rýchlo do strojového kódu, napriek tomu má výhodu garbage collection a silu run-time. Je to rýchly, staticky napísaný, skompilovaný jazyk, ktorý sa chová ako by bol dynamického typu, interpretovaný jazykom.
Go efektívne - 1.diel
Podobne ako v C, Go formálna gramatika používa bodkočiarky pre zachytenie konca príkazu; na rozdiel od C, tieto bodkočiarky nezobrazia v zdroji. Namiesto toho lexer (lexer? asi nejaký preklep. p.p.) používa jednoduché pravidlo pre automatické vloženie bodkočiarky pri skenovaní, takže vstupný text je od nich oslobodený.
Pravidlo je toto. Ak posledný znak pred novým riadkom je jednoduchý identifikátor (ktorý zahŕňa slová ako int a float64), jednoduchého typu string alebo number, alebo jeden z následujúcich častí
lexer vždy vloží bodkočiarku na túto časť. Dalo by sa to zhrnúť ako, ak následuje nový riadok po vyhradenom príkaze, ktorý by mohol skončiť príkazom, pridaj bodkočiarku.
Bodkočiarka môže byť vynechaná bezprostredne pred uzatváracou zátvorkou.
Štylizované Go programy majú bodkočiarky iba na miestach ako for smyčky pre oddelenie iniciátoru, stavu a udalosti. Tiež sú nevyhnutné pri písaní viacej príkazov na riadok. Tak by ste mali písať kód aj vy.
Jedno upozornenie. Nemali by ste nikdy vložiť otváraciu zátvorku podmienky na nový riadok. Ak to tak spravíte, bodkočiarka bude vložená na koniec riadka, čo by malo nežiadúci efekt.
Píšte následujúcim spôsobom :
nikdy nie takto:
p.p. => poznámka prekladateľa
Riadiace štruktúry (aneb podmienky) v Go, sú podobné ako v C, ale líšia sa v dôležitých smeroch. Tu niesu do alebo while smyčky, len jedoduché for; switch je viac flexibilnejšie; if a switch akceptujú inicializačné znaky podobne ako for; sú tu aj nové riadiace štruktúry prepínacieho a multi-smerového komunikačného multiplexra, select. Syntax je tiež trochu pozmenená: zátvorky nie sú povinné a telá musia byť vždy z oddeľovačmi.
Jednoduché if v Go vyzerá takto:
Zložité zátvorky podporené multi-riadkovým zápisom. Je to dobrý štýl písania, obzvlášť keď má funkcia návratovú hodnotu
if a switch akceptujú inicializačné znaky, podobne ako for. Preto je bežné vidieť nastavenie lokálnej premennej.
V knižniciach jazyka Go môžete natrafiť na podmienky bez tela (sú to ukončenia break, continue, goto alebo return), ktoré boli odstránené pre nepotrebnosť.
Toto je príklad situácie, kedy musí kód zabezpečiť chybové stavy. Kód sa dobre číta ak je nasledovaný podmienkou ku koncu stránky, čo eliminuje prípadné chyby. Vzhľadom k tomu že v prípade chyby skočí program na return, netreba else používať.
Smyčka for je podobná (nie však rovnaká) ako v C. Je zjednodušená, čím aj nahrádza smyčku while.
// Podobne ako for v C
for init; condition; post { }
// Podobne ako while v C
for condition { }
// Podobne ako for(;;) v C
for { }
Krátka deklarácia uľahčuje deklarovanie indexu v smyčke.
Keď používate polia, retazce, mapy alebo čítate z rúr(channel), príkaz range vám bude určite nápomocný.
Pokial použijete inú znakovú sadu ako UTF-8, príkaz range bude fungovať pod výnimkou, viď príklad číslovania poradia.
výpis bude
A nakoniec, Go nemá čiarku operátor a ++ a -- sú výroky, nie výrazy. Takže ak chcete použiť viacej premenných v smyčke for, môžete to urobiť pomocou paralelného priradenia
Prepínač switch je v jazyku Go všeobecnejší ako v C. Výrazy nemusia byť konstanty alebo čísla, hodnoty sú porovnávané z hora nadol pokial sa nenájde zhoda, pokial však switch nenájde žiadnu zhodu, prepne sa na true. Je preto možné písať (obrazne) ako if-else-if-else v prepínači switch.
Tu je porovnanie pre rutinné bytové pole, ktorá používa dva príkazy switch:
Switch môže byť rovnako použité na zistenie dynamického typu šablónovej premennej.
Pokračovanie nájdete v budúcom článku.
zdroj
Bodkočiarka ;
Podobne ako v C, Go formálna gramatika používa bodkočiarky pre zachytenie konca príkazu; na rozdiel od C, tieto bodkočiarky nezobrazia v zdroji. Namiesto toho lexer (lexer? asi nejaký preklep. p.p.) používa jednoduché pravidlo pre automatické vloženie bodkočiarky pri skenovaní, takže vstupný text je od nich oslobodený.
Pravidlo je toto. Ak posledný znak pred novým riadkom je jednoduchý identifikátor (ktorý zahŕňa slová ako int a float64), jednoduchého typu string alebo number, alebo jeden z následujúcich častí
break continue fallthrough return ++ -- ) }
lexer vždy vloží bodkočiarku na túto časť. Dalo by sa to zhrnúť ako, ak následuje nový riadok po vyhradenom príkaze, ktorý by mohol skončiť príkazom, pridaj bodkočiarku.
Bodkočiarka môže byť vynechaná bezprostredne pred uzatváracou zátvorkou.
go func() { for { dst <- <-src } }()
Štylizované Go programy majú bodkočiarky iba na miestach ako for smyčky pre oddelenie iniciátoru, stavu a udalosti. Tiež sú nevyhnutné pri písaní viacej príkazov na riadok. Tak by ste mali písať kód aj vy.
Jedno upozornenie. Nemali by ste nikdy vložiť otváraciu zátvorku podmienky na nový riadok. Ak to tak spravíte, bodkočiarka bude vložená na koniec riadka, čo by malo nežiadúci efekt.
Píšte následujúcim spôsobom :
if i < f() {
g()
}
g()
}
nikdy nie takto:
if i < f() // zle!
{ // zle!
g()
}
{ // zle!
g()
}
p.p. => poznámka prekladateľa
Riadiace štruktúry
Riadiace štruktúry (aneb podmienky) v Go, sú podobné ako v C, ale líšia sa v dôležitých smeroch. Tu niesu do alebo while smyčky, len jedoduché for; switch je viac flexibilnejšie; if a switch akceptujú inicializačné znaky podobne ako for; sú tu aj nové riadiace štruktúry prepínacieho a multi-smerového komunikačného multiplexra, select. Syntax je tiež trochu pozmenená: zátvorky nie sú povinné a telá musia byť vždy z oddeľovačmi.
If
Jednoduché if v Go vyzerá takto:
if x > 0 {
return y
}
return y
}
Zložité zátvorky podporené multi-riadkovým zápisom. Je to dobrý štýl písania, obzvlášť keď má funkcia návratovú hodnotu
if a switch akceptujú inicializačné znaky, podobne ako for. Preto je bežné vidieť nastavenie lokálnej premennej.
if err := file.Chmod(0664); err != nil {
log.Print(err)
return err
}
log.Print(err)
return err
}
V knižniciach jazyka Go môžete natrafiť na podmienky bez tela (sú to ukončenia break, continue, goto alebo return), ktoré boli odstránené pre nepotrebnosť.
f, err := os.Open(name, os.O_RDONLY, 0)
if err != nil {
return err
}
codeUsing(f)
if err != nil {
return err
}
codeUsing(f)
Toto je príklad situácie, kedy musí kód zabezpečiť chybové stavy. Kód sa dobre číta ak je nasledovaný podmienkou ku koncu stránky, čo eliminuje prípadné chyby. Vzhľadom k tomu že v prípade chyby skočí program na return, netreba else používať.
f, err := os.Open(name, os.O_RDONLY, 0)
if err != nil {
return err
}
d, err := f.Stat()
if err != nil {
return err
}
codeUsing(f, d)
if err != nil {
return err
}
d, err := f.Stat()
if err != nil {
return err
}
codeUsing(f, d)
For
Smyčka for je podobná (nie však rovnaká) ako v C. Je zjednodušená, čím aj nahrádza smyčku while.
// Podobne ako for v C
for init; condition; post { }
// Podobne ako while v C
for condition { }
// Podobne ako for(;;) v C
for { }
Krátka deklarácia uľahčuje deklarovanie indexu v smyčke.
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
for i := 0; i < 10; i++ {
sum += i
}
Keď používate polia, retazce, mapy alebo čítate z rúr(channel), príkaz range vám bude určite nápomocný.
var m map[string]int
sum := 0
for _, value := range m { // kľúč nieje použitý
sum += value
}
sum := 0
for _, value := range m { // kľúč nieje použitý
sum += value
}
Pokial použijete inú znakovú sadu ako UTF-8, príkaz range bude fungovať pod výnimkou, viď príklad číslovania poradia.
for pos, char := range "日本語" {
fmt.Printf("character %c starts at byte position %dn", char, pos)
}
fmt.Printf("character %c starts at byte position %dn", char, pos)
}
výpis bude
character 日 starts at byte position 0
character 本 starts at byte position 3
character 語 starts at byte position 6
character 本 starts at byte position 3
character 語 starts at byte position 6
A nakoniec, Go nemá čiarku operátor a ++ a -- sú výroky, nie výrazy. Takže ak chcete použiť viacej premenných v smyčke for, môžete to urobiť pomocou paralelného priradenia
// Reverse a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[ i ], a[ j ] = a[ j ], a[ i ]
}
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[ i ], a[ j ] = a[ j ], a[ i ]
}
Switch
Prepínač switch je v jazyku Go všeobecnejší ako v C. Výrazy nemusia byť konstanty alebo čísla, hodnoty sú porovnávané z hora nadol pokial sa nenájde zhoda, pokial však switch nenájde žiadnu zhodu, prepne sa na true. Je preto možné písať (obrazne) ako if-else-if-else v prepínači switch.
func unhex(c byte) byte {
switch {
case 0 <= c && c <= 9 :
return c - 0
case a <= c && c <= f :
return c - a + 10
case A <= c && c <= F :
return c - A + 10
}
return 0
}
switch {
case 0 <= c && c <= 9 :
return c - 0
case a <= c && c <= f :
return c - a + 10
case A <= c && c <= F :
return c - A + 10
}
return 0
}
func shouldEscape(c byte) bool {
switch c {
case " ", "?", "&", "=", "#", "+", "%":
return true
}
return false
}
switch c {
case " ", "?", "&", "=", "#", "+", "%":
return true
}
return false
}
Tu je porovnanie pre rutinné bytové pole, ktorá používa dva príkazy switch:
// Porovnávanie vráti integer porovnaný z dvoma polami
// lexikograficky.
// výsledok bude 0 if a == b, -1 if a < b, and +1 if a > b
func Compare(a, b []byte) int {
for i := 0; i < len(a) && i < len(b); i++ {
switch {
case a > b:
return 1
case a < b:
return -1
}
}
switch {
case len(a) < len(b):
return -1
case len(a) > len(b):
return 1
}
return 0
}
// lexikograficky.
// výsledok bude 0 if a == b, -1 if a < b, and +1 if a > b
func Compare(a, b []byte) int {
for i := 0; i < len(a) && i < len(b); i++ {
switch {
case a > b:
return 1
case a < b:
return -1
}
}
switch {
case len(a) < len(b):
return -1
case len(a) > len(b):
return 1
}
return 0
}
Switch môže byť rovnako použité na zistenie dynamického typu šablónovej premennej.
switch t := interfaceValue.(type) {
default:
fmt.Printf("unexpected type %T", t) // %T prints type
case bool:
fmt.Printf("boolean %tn", t)
case int:
fmt.Printf("integer %dn", t)
case *bool:
fmt.Printf("pointer to boolean %tn", *t)
case *int:
fmt.Printf("pointer to integer %dn", *t)
}
default:
fmt.Printf("unexpected type %T", t) // %T prints type
case bool:
fmt.Printf("boolean %tn", t)
case int:
fmt.Printf("integer %dn", t)
case *bool:
fmt.Printf("pointer to boolean %tn", *t)
case *int:
fmt.Printf("pointer to integer %dn", *t)
}
Pokračovanie nájdete v budúcom článku.
zdroj
Komentáře
Přidat nový
Pro přispívání musíte být přihlášen



