Maninona no ratsy ho an'ny Programmer Smart ny Go Design

Nandritra ny volana lasa izay dia nampiasa Go aho ho fampiharana. Porofon'ny Concept (eo ho eo: kaody hitsapana ny fiasan'ny hevitra iray) amin'ny fotoana malalakany, amin'ny ampahany amin'ny fianarana ny fiteny fandaharana. Ny programa dia tena tsotra ary tsy ny tanjon'ity lahatsoratra ity, fa ny traikefa amin'ny fampiasana Go mihitsy no mendrika teny vitsivitsy momba izany. Mandehana mampanantena fa ho (eo ho eo: lahatsoratra nosoratana tamin'ny taona 2015) fiteny malaza ho an'ny fehezan-dalΓ na matotra. Noforonin'i Google ilay fiteny, izay ampiasana azy io. Fehiny, heveriko marina fa ratsy ho an'ny mpandrindra marani-tsaina ny famolavolana ny fiteny Go.

Natao ho an'ny mpandrindra programa malemy?

Ny mandeha dia tena mora ianarana, mora tokoa ka ny fampidirana dia nitondra ahy indray takariva, ary avy eo dia afaka nanao code aho. Ilay boky nianarako taloha dia antsoina hoe Go Fampidirana ny fandaharana ao amin'ny Go (fandikan-teny), azo jerena amin'ny Internet. Ny boky, toa ny kaody loharano Go, dia mora vakina, manana ohatra kaody tsara, ary misy pejy 150 eo ho eo izay azo vakiana indray mandeha. Ity fahatsorana ity dia mamelombelona amin'ny voalohany, indrindra amin'ny tontolon'ny fandaharana feno teknolojia sarotra. Saingy amin’ny farany, na ho ela na ho haingana, dia tonga ny eritreritra hoe: β€œTena marina tokoa ve izany?”

Nilaza i Google fa ny fahatsoran'i Go no fivarotana azy ary ny fiteny dia natao ho an'ny vokatra ambony indrindra amin'ny ekipa lehibe, saingy misalasala aho. Misy endri-javatra izay tsy hita na be pitsiny. Ary izany rehetra izany dia noho ny tsy fahampian'ny fahatokisana amin'ny mpamorona, miaraka amin'ny fiheverana fa tsy mahavita zavatra tsara izy ireo. Fanapahan-kevitra avy amin'ny mpamorona ny fiteny io faniriana fahatsorana io, ary mba hahatakarana tsara ny antony nilaina azy, dia tsy maintsy takatsika ny antony manosika ny mpamorona sy ny ezak'izy ireo hotratrarina ao amin'ny Go.

Koa nahoana izy io no natao tsotra? Ireto misy teny vitsivitsy Rob Pike (eo ho eo: iray amin'ireo mpiara-mamorona ny fiteny Go):

Ny teboka manan-danja eto dia ny programer (eo ho eo: Googlers) dia tsy mpikaroka. Matetika izy ireo dia tanora, tonga eto amintsika rehefa avy nianatra, angamba nianatra Java, na C/C++, na Python. Tsy mahazo fiteny lehibe izy ireo, saingy tianay koa izy ireo hamorona rindrambaiko tsara. Izany no mahatonga ny fiteniny ho mora azon’izy ireo sy ianarana.
 
Tokony ho zatra izy, mitovitovy amin'ny C. Ireo mpandrindra miasa ao amin'ny Google dia manomboka ny asany aloha ary mahazatra amin'ny fiteny ara-dalΓ na, indrindra ny fianakaviana C. Ny fepetra takiana amin'ny famokarana haingana amin'ny fiteny fandaharana vaovao dia midika fa tsy tokony ho radical loatra ilay fiteny.

Inona? Noho izany, i Rob Pike dia milaza fa tsy dia tsara loatra ny mpamorona ao amin'ny Google, izany no nahatonga azy ireo namorona fiteny ho an'ny adala (eo ho eo: moana) mba hahavitany zavatra. Inona no fomba fijery miavonavona amin'ny mpiara-miasa aminao? Nino foana aho fa ny mpamorona an'i Google dia voafantina avy amin'ny mazava sy tsara indrindra eto an-tany. Azo antoka fa mahavita zavatra sarotra kokoa izy ireo?

Artifacts amin'ny fahatsorana tafahoatra

Ny hoe tsotra dia tanjona mendrika amin'ny endrika rehetra, ary sarotra ny manandrana manao zavatra tsotra. Na izany aza, rehefa miezaka mamaha (na maneho mihitsy aza) olana sarotra, indraindray dia ilaina ny fitaovana sarotra. Ny fahasarotana sy ny fahasarotana dia tsy ny endri-javatra tsara indrindra amin'ny fiteny fandaharana, fa misy eo afovoany ahafahan'ilay fiteny mamorona abstractions kanto izay mora azo sy ampiasaina.

Tsy dia maneho hevitra loatra

Noho ny fanoloran-tenany amin'ny fahatsoran'ny Go dia tsy ampy ny fanamboarana izay heverina ho voajanahary amin'ny fiteny hafa. Toa hevitra tsara izany amin'ny voalohany, saingy amin'ny fampiharana dia miteraka fehezan-teny verbose. Ny anton'izany dia tokony hiharihary - mila mora ho an'ny mpamorona ny mamaky ny kaody hafa, fa raha ny marina dia manimba ny fahaiza-mamaky fotsiny ireo fanatsorana ireo. Tsy misy fanafohezana ao amin'ny Go: na betsaka na tsia.

Ohatra, ny fampitaovana fampiononana izay mamaky stdin na rakitra avy amin'ny tohan-kevitry ny baiko dia toa izao:

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)
}

Na dia miezaka ny ho amin'ny ankapobeny araka izay azo atao aza ity fehezan-dalΓ na ity, dia miditra amin'ny lalana ny teny fanerena an'i Go, ary vokatr'izany, ny famahana olana tsotra dia miteraka kaody be dia be.

Eto, ohatra, dia vahaolana amin'ny olana mitovy amin'ny 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);
    }
}

Ary iza no mora vakiana kokoa ankehitriny? Omeko an'i D ny vatoko. Mora vakiana kokoa ny fehezan-dalΓ na misy azy satria mamaritra mazava kokoa ny hetsika. D dia mampiasa hevitra sarotra kokoa (eo ho eo: fiantsoana asa hafa ΠΈ iombonana) noho ny ao amin'ny ohatra Go, saingy tsy misy sarotra ny mahatakatra azy ireo.

Helo manao kopia

Ny soso-kevitra malaza amin'ny fanatsarana ny Go dia ny ankapobeny. Izany farafaharatsiny dia hanampy amin'ny fisorohana ny kopia tsy ilaina amin'ny kaody hanohanana ny karazana data rehetra. Ohatra, ny asa iray amin'ny famintinana ny lisitry ny isa dia tsy azo ampiharina amin'ny fomba hafa afa-tsy amin'ny alΓ lan'ny fametahana ny fiasa fototra ho an'ny karazana integer tsirairay; tsy misy fomba hafa:

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))
}

Ary ity ohatra ity dia tsy mety amin'ny karazana voasonia akory. Ity fomba fiasa ity dia mandika tanteraka ny fitsipiky ny tsy mamerina ny tenanao (MAIMA), iray amin'ireo fitsipika malaza sy miharihary indrindra, tsy miraharaha izay loharanon'ny fahadisoana maro. Nahoana i Go no manao izany? Lafiny mahatsiravina amin'ny fiteny izany.

Ohatra mitovy amin'ny D:

import std.stdio;
import std.algorithm;

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

Tsotra, kanto ary mivantana amin'ny teboka. Ny asa ampiasaina eto dia reduce ho an'ny karazana template sy predicate. Eny, sarotra kokoa noho ny dikan-teny Go izany, saingy tsy sarotra ho an'ny mpandrindra marani-tsaina hahatakatra izany. Iza amin'ireo ohatra no mora karakaraina sy mora vakina?

Famakiana rafitra karazana tsotra

Azoko sary an-tsaina fa ny mpandrindra fandaharana ao amin'ny Go mamaky an'ity dia miboiboika amin'ny vava ary mikiakiaka hoe: "Diso ny ataonao!" Eny, misy fomba iray hafa hanaovana asa sy karazana jeneraly, fa manimba tanteraka ny rafitra karazana izany!

Jereo ity ohatra momba ny fiteny adala ity hamahana ny olana:

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)
}

Ity fampiharana ity Reduce nindramina tamin'ny lahatsoratra Generic idiomatic ao amin'ny Go (eo ho eo: Tsy hitako ny dikanteny, faly aho raha manampy an'ity ianao). Eny ary, raha idiomatic izany dia tsy tiako ny mahita ohatra tsy idiomatic. Fampiasana interface{} - saro-kenatra, ary amin'ny fiteny dia ilaina ny mandingana ny fanoratana. Ity dia interface tsara ary ny karazany rehetra dia mampihatra izany, manome fahafahana tanteraka ho an'ny rehetra. Tena ratsy be io fomba fandaharana io, ary tsy izay ihany. Ny hetsika akrobatika toy izany dia mitaky ny fampiasana fisaintsainana ny fotoana. Na i Rob Pike aza dia tsy tia ny olona manararaotra izany, araka ny voalazany tao amin'ny iray amin'ireo tatitra nataony.

Ity dia fitaovana mahery vaika izay tokony hampiasaina amim-pitandremana. Tokony hohalavirina izany raha tsy tena ilaina.

Maka modely D aho fa tsy ity hadalana ity. Ahoana no ahafahan'ny olona miteny an'izany interface{} mora vakiana kokoa na mitendry azo antoka aza?

Ny loza ateraky ny fitantanana ny fiankinan-doha

Go dia manana rafitra fiankinan-doha naorina eo an-tampon'ireo mpamatsy fampiantranoana malaza VCS. Ny fitaovana miaraka amin'i Go dia mahafantatra momba ireo serivisy ireo ary afaka misintona, manamboatra ary mametraka kaody avy amin'izy ireo amin'ny fotoana iray. Na dia tsara aza izany, dia misy lesoka lehibe amin'ny versioning! Eny, marina fa afaka mahazo ny kaody loharano amin'ny serivisy toa ny github na bitbucket ianao amin'ny fampiasana fitaovana Go, saingy tsy azonao atao ny mamaritra ny dikan-teny. Ary indray ny fahatsorana amin'ny fandaniana ny mahasoa. Tsy azoko ny lojikan'ny fanapahan-kevitra toy izany.

Taorian'ny fametrahana fanontaniana momba ny vahaolana amin'ity olana ity dia namorona ny ekipa fampandrosoana Go forum thread, izay nanoritra ny fomba handehanan'izy ireo hamahana ity olana ity. Ny soso-kevitr'izy ireo dia ny handika fotsiny ny tahiry manontolo ao amin'ny tetikasanao indray andro any ary avelao izany "toy ny misy." Inona no eritreretin'izy ireo? Manana rafitra fanaraha-maso dikan-teny mahagaga izahay miaraka amin'ny fametahana marika sy fanohanana dikan-teny izay tsy omen'ny mpamorona Go ary mandika fotsiny ny kaody loharano.

Entan'ny kolontsaina avy amin'i Xi

Araka ny hevitro, ny Go dia novolavolain'ireo olona nampiasa C nandritra ny androm-piainany sy ireo izay tsy te hanandrana zava-baovao. Ny fiteny dia azo lazaina ho C miaraka amin'ny kodiarana fanampiny (orig.: kodiarana fanofanana). Tsy misy hevitra vaovao ao, afa-tsy ny fanohanana ny parallèle (izay, raha ny marina, dia mahafinaritra) ary izany dia mahamenatra. Manana parallèle tsara ianao amin'ny fiteny zara raha ampiasaina sy mandringa.

Olana iray hafa mikoropaka dia ny hoe Go dia fiteny procΓ©dure (tahaka ny horohoro mangina an'ny C). Miafara amin'ny fanoratana kaody amin'ny fomba fanao izay toa tranainy sy lany andro ianao. Fantatro fa tsy bala volafotsy ny fandaharana miompana amin'ny zavatra, fa tena tsara raha afaka mamoaka ny antsipiriany ho karazana ary manome encapsulation.

Fahatsorana ho an'ny tombontsoanao manokana

Ny Go dia natao ho tsotra ary mahomby amin'izany tanjona izany. Nosoratana ho an'ny mpandrindra programa malemy izy io, mampiasa fiteny tranainy ho modely. Izy io dia feno fitaovana tsotra hanaovana zavatra tsotra. Mora vakina sady mora ampiasaina.

Tena miteniteny foana, tsy manaitra ary ratsy ho an'ny mpandrindra marani-tsaina.

Бпасибо mersinvald ho an'ny fanovana

Source: www.habr.com

Add a comment