Nei Go Dhizaini Yakashata kune Smart Programmers

Mumwedzi yapfuura ndanga ndichishandisa Go kuti ndiite. Uchapupu hwePfungwa (approx.: kodhi yekuyedza kushanda kwezano) munguva yake yemahara, chikamu chekudzidza mutauro wechirongwa pachawo. Zvirongwa pachazvo zviri nyore kwazvo uye hazvisi izvo chinangwa chechinyorwa ichi, asi ruzivo rwekushandisa Go pacharo runokodzera mazwi mashoma pamusoro payo. Enda unovimbisa kuva (approx.: chinyorwa chakanyorwa muna 2015) mutauro unozivikanwa kune yakakomba scalable kodhi. Mutauro wakagadzirwa neGoogle, uko unoshandiswa zvakanyanya. Pazasi, ini ndinofunga nemoyo wese kuti dhizaini yemutauro weGo yakashata kune vakangwara programmers.

Yakagadzirirwa vasina simba programmers?

Enda iri nyore kwazvo kudzidza, zviri nyore zvekuti sumo yakanditora mamwe manheru, mushure mezvo ndaigona kutonyora zvinobudirira. Bhuku randaigara ndichidzidza rinonzi Go Nhanganyaya yeProgramming muGo (kududzira), inowanikwa online. Iro bhuku, senge Go source kodhi pachayo, iri nyore kuverenga, ine yakanaka kodhi mienzaniso, uye ine anenge zana nemakumi mashanu emapeji anogona kuverengerwa kamwe chete. Kureruka uku kunozorodza pakutanga, kunyanya munyika yemapurogiramu yakazadzwa nehunyanzvi hwakanyanya kuoma. Asi pakupedzisira, nokukurumidza kana kuti gare gare mufungo unomuka: β€œIzvi ndizvo chaizvoizvo here?”

Google inoti Go kupusa inzvimbo yayo yekutengesa uye mutauro wakagadzirirwa kuti ubudirire muzvikwata zvikuru, asi ini ndinopokana nazvo. Pane zvimiro zvinenge zvisipo kana kuti zvakanyanyowandisa. Uye zvose nekuda kwekushaya kuvimba nevagadziri, nekufungidzira kuti havakwanisi kuita chero chinhu chakanaka. Ichi chishuvo chekureruka yaive sarudzo yekuziva nevagadziri vemutauro, uye kuti tinzwisise zvizere kuti nei ichidikanwa, isu tinofanirwa kunzwisisa kurudziro yevagadziri uye zvavaiyedza kuita muGo.

Saka nei yakaitwa nyore? Heano mashoma ekotesheni Rob Pike (approx.: mumwe wevagadziri vemutauro weGo):

Chinhu chakakosha apa ndechekuti vagadziri vedu (approx.: Vashandi veGoogle) havasi vaongorori. Ivo, sekutonga, vadiki kwazvo, vanouya kwatiri mushure mekudzidza, pamwe vakadzidza Java, kana C / C ++, kana Python. Havagoni kunzwisisa mutauro mukuru, asi panguva imwe chete tinoda kuti vagadzire software yakanaka. Ndicho chikonzero nei mutauro wavo uchifanira kuva nyore kwavari kunzwisisa nokudzidza.
 
Anofanira kunge akajairana, achingotaura zvakafanana naC. Vagadziri vezvirongwa vanoshanda kuGoogle vanotanga mabasa avo nekukurumidza uye vanonyanya kujairana nemitauro yemaitiro, kunyanya mhuri yeC. Chinodiwa chekukurumidza kugadzira mumutauro mutsva wechirongwa zvinoreva kuti mutauro haufanirwe kuve wakanyanya.

Chii? Saka Rob Pike ari kutaura kuti vanogadzira paGoogle havana kunaka, ndosaka vakagadzira mutauro wemapenzi (approx.: dumbed down) kuti vakwanise kuita chimwe chinhu. Ndeupi rudzi rwekuzvikudza kune vaunoshanda navo? Ndagara ndichitenda kuti vanogadzira Google vanosarudzwa kubva kune anopenya uye akanakisa paPasi. Chokwadi vanogona kubata chimwe chinhu chakaoma?

Zvigadzirwa zvekupfava zvakanyanya

Kuve nyore chinangwa chakakodzera mune chero dhizaini, uye kuedza kuita chinhu chiri nyore kwakaoma. Zvisinei, pakuedza kugadzirisa (kana kunyange kutaura) matambudziko akaoma, dzimwe nguva chimbo chakaoma chinodiwa. Kuomarara uye kuomesesa hazvisi izvo zvakanakisa zvemutauro wechirongwa, asi pane nzvimbo yepakati umo mutauro unogona kugadzira zvinoyevedza zvipfupi zviri nyore kunzwisisa nekushandisa.

Kwete kutaura zvakanyanya

Nekuda kwekuzvipira kwayo mukureruka, Go inoshaya zvivakwa zvinoonekwa sezvakasikwa mune mimwe mitauro. Izvi zvingaita sepfungwa yakanaka pakutanga, asi mukuita zvinoguma nekodhi yezwi. Chikonzero cheizvi chinofanira kuve pachena - zvinofanirwa kuve nyore kune vanogadzira kuti vaverenge kodhi yevamwe vanhu, asi kutaura zvazviri izvi zviri nyore zvinongokuvadza kuverenga. Iko hakuna zvipfupiso muGo: ingave yakawanda kana hapana.

Semuenzaniso, console utility iyo inoverenga stdin kana faira kubva kune yekuraira mutsara nharo inotaridzika seizvi:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()
    flags := flag.Args()

    var text string
    var scanner *bufio.Scanner
    var err error

    if len(flags) > 0 {

        file, err := os.Open(flags[0])

        if err != nil {
            log.Fatal(err)
        }

        scanner = bufio.NewScanner(file)

    } else {
        scanner = bufio.NewScanner(os.Stdin)
    }

    for scanner.Scan() {
        text += scanner.Text()
    }

    err = scanner.Err()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

Kunyangwe iyi kodhi zvakare ichiedza kuve yakajairwa sezvinobvira, Go's yekumanikidza verbosity inopinda munzira, uye semhedzisiro, kugadzirisa dambudziko riri nyore kunoguma nehuwandu hukuru hwekodhi.

Heino, semuenzaniso, mhinduro kudambudziko rimwechete mukati D:

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

Uye ndiani anoverengeka zvino? Ndichapa vhoti yangu kuna D. Kodhi yake inoverengeka zvakanyanya nekuti anotsanangura zviito zvakajeka. D inoshandisa pfungwa dzakaoma kunzwisisa (approx.: imwe nzira yekufona ΠΈ matemplate) kupfuura mumuenzaniso weGo, asi hapana chakaoma pakunzwisisa kwavo.

Gehena rekukopa

Kurudziro yakakurumbira yekuvandudza Go ndeye generality. Izvi zvichabatsira kudzivirira kukopa kusingakodzeri kwekodhi kutsigira ese marudzi e data. Semuyenzaniso, basa rekupfupisa runyoro rwemanhamba rinogona kuitwa pasina imwe nzira kunze kwekukopa-namisa basa rayo rekutanga pamhando yega yega yega; hapana imwe nzira:

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int16Sum(list []int16) (uint64) {
    var result int16 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int8Sum(list []int8) (uint64) {
    var result int8 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list8  := []int8 {1, 2, 3, 4, 5}
    list16 := []int16{1, 2, 3, 4, 5}
    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int8Sum(list8))
    fmt.Println(int16Sum(list16))
    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Uye muenzaniso uyu hautomboshandi kune akasaina mhando. Iyi nzira inotyora zvachose musimboti wekusazvidzokorora (KUOMA), imwe yemisimboti yakakurumbira uye iri pachena, tichiregeredza izvo zvinokonzeresa kukanganisa kwakawanda. Sei Go achiita izvi? Ichi chimiro chakashata chemutauro.

Muenzaniso wakafanana paD:

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

Nyore, inoyevedza uye yakananga kune iyo poindi. Basa rinoshandiswa pano nderokuti reduce yemhando yetemplate uye predicate. Ehe, izvi zvakare zvakanyanya kuomarara kupfuura iyo Go vhezheni, asi hazvina kuomera kuti vakangwara programmer vanzwisise. Muenzaniso upi uri nyore kuchengeta uye uri nyore kuverenga?

Nyore mhando system bypass

Ini ndinofungidzira Go vagadziri vezvirongwa vachiverenga izvi vanenge vachipupuma furo pamuromo uye vachipopota, "Uri kuzviita zvisizvo!" Zvakanaka, pane imwe nzira yekugadzira generic basa uye mhando, asi inotyora zvachose mhando system!

Tarisa uone uyu muenzaniso weupenzi kugadzirisa mutauro kugadzirisa dambudziko:

package main

import "fmt"
import "reflect"

func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
    val := reflect.ValueOf(in)

    for i := 0; i < val.Len(); i++ {
        memo = fn(val.Index(i).Interface(), memo)
    }

    return memo
}

func main() {

    list := []int{1, 2, 3, 4, 5}

    result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
        return memo.(int) + val.(int)
    })

    fmt.Println(result)
}

Kuitwa uku Reduce yakakweretwa kubva pachinyorwa Idiomatic generics muGo (approx.: Handina kuwana shanduro, ndichafara kana iwe ukabatsira neizvi). Zvakanaka, kana iri idiomatic, ndingavenga kuona isiri-idiomatic muenzaniso. Usage interface{} - farce, uye mumutauro inodiwa chete kunzvenga kutaipa. Iyi inzvimbo isina chinhu uye marudzi ese anoishandisa, ichibvumira rusununguko rwakakwana kune wese munhu. Iyi nzira yekuronga yakashata zvakanyanya, uye handizvo zvese. Acrobatic feats seizvi inoda kushandiswa kwekumhanya-mhanya kuratidza. Kunyangwe Rob Pike haadi vanhu vanoshungurudza izvi, sezvaakataura mune imwe yemishumo yake.

Ichi chishandiso chine simba chinofanira kushandiswa nekuchenjerera. Inofanira kudziviswa kunze kwekunge ichinyatsodikanwa.

Ini ndaizotora maD matemplate pane izvi zvisina maturo. Munhu angadaro sei interface{} inoverengeka kana kutotaipa safe?

Nhamo dzeDependency Management

Go ine yakavakirwa-mukati yekutsamira sisitimu yakavakirwa pamusoro pevanozivikanwa vanopa vanopa VCS. Maturusi anouya neGo anoziva nezve masevhisi aya uye anogona kudhawunirodha, kuvaka, uye kuisa kodhi kubva kwavari mune imwe yakadonha swoop. Kunyange izvi zvakanaka, pane kukanganisa kukuru nekushandura! Ehe, ichokwadi kuti iwe unogona kuwana iyo kodhi kodhi kubva kumasevhisi segithub kana bitbucket uchishandisa Go zvishandiso, asi haugone kutsanangura iyo vhezheni. Uye zvakare kuve nyore pamutengo wekubatsira. Ini handisi kukwanisa kunzwisisa logic yesarudzo yakadai.

Mushure mekubvunza mibvunzo nezve mhinduro kudambudziko iri, timu yekuvandudza Go yakagadzira forum thread, izvo zvairatidza kuti vaizozvifambisa sei panyaya iyi. Kurudziro yavo yaive yekungokopa iyo yese repository muchirongwa chako rimwe zuva woisiya "sezvazviri." Chii chavari kufunga? Tine zvinoshamisa shanduro yekudzora masisitimu ane tagging yakakura uye vhezheni tsigiro inoregeredzwa nevagadziri veGo uye vanongokopa iyo kodhi kodhi.

Cultural baggage kubva Xi

Sekuona kwangu, Go rakagadzirwa nevanhu vanga vashandisa C hupenyu hwavo hwese uye neavo vaisada kuedza chimwe chinhu chitsva. Mutauro unogona kutsanangurwa seC uine mamwe mavhiri (orig.: mavhiri ekudzidzisa) Iko hakuna mazano matsva mairi, kunze kwekutsigirwa kweparallelism (iyo, nenzira, inoshamisa) uye izvi zvinonyadzisa. Iwe une kuenderana kwakanaka mumutauro usinga shandiswe, unokamhina.

Rimwe dambudziko rinowedzera nderekuti Go mutauro wemaitiro (sekutyisa kwakanyarara kweC). Iwe unopedzisira wanyora kodhi mune yemaitiro maitiro anonzwa echinyakare uye echinyakare. Ndinoziva chirongwa chakanangana nechinhu hachisi bara resirivheri, asi zvingave zvakanaka kukwanisa kubvisa izvo mumhando uye kupa encapsulation.

Zviri nyore kuti iwe pachako ubatsirwe

Go rakagadzirirwa kuve nyore uye rinobudirira pane icho chinangwa. Yakanyorerwa vagadziri vasina simba, vachishandisa mutauro wekare setemplate. Inouya yakakwana nezvishandiso zviri nyore kuita zvinhu zviri nyore. Zviri nyore kuverenga uye nyore kushandisa.

Zvakanyanya verbose, hazvishamisi, uye zvakaipa kune vakangwara zvirongwa.

Бпасибо mersinvald zvekugadzirisa

Source: www.habr.com

Voeg