Kungani i-Go Design iyimbi kubahleli bezinhlelo ezihlakaniphile

Ezinyangeni ezedlule bengisebenzisa i-Go ukuze ngiyisebenzise. Ubufakazi Bombono (cishe.: ikhodi yokuhlola ukusebenza kombono) ngesikhathi sakhe samahhala, ngokwengxenye ukufunda ulimi lokuhlela ngokwalo. Izinhlelo ngokwazo zilula kakhulu futhi aziyona inhloso yalesi sihloko, kodwa isipiliyoni sokusebenzisa i-Go ngokwaso sifanelwe amagama ambalwa ngakho. Hamba uthembisa ukuba (cishe.: i-athikili eyabhalwa ngo-2015) ulimi oludumile lwekhodi eyingozi eyingozi. Ulimi lwakhiwe yi-Google, lapho lusetshenziswa khona. Ngezansi, ngicabanga ngokweqiniso ukuthi idizayini yolimi lwe-Go ayilungile kubahleli bezinhlelo abahlakaniphile.

Idizayinelwe abahleli bezinhlelo ababuthakathaka?

I-Go kulula kakhulu ukuyifunda, kulula kangangokuthi isingeniso sangithatha ngobunye kusihlwa, ngemva kwalokho ngase ngikwazi ukubhala amakhodi ngendlela ephumelelayo. Incwadi engangiyifundela Go Isingeniso se-Programming in Go (ukuhumusha), itholakala ku-inthanethi. Incwadi, njengekhodi yomthombo we-Go ngokwayo, ifundeka kalula, inezibonelo ezinhle zekhodi, futhi iqukethe cishe amakhasi ayi-150 angafundwa ngesikhathi esisodwa. Lokhu kubalula kuyaqabula ekuqaleni, ikakhulukazi emhlabeni wezinhlelo ogcwele ubuchwepheshe obuyinkimbinkimbi kakhulu. Kodwa ekugcineni, ngokushesha noma kamuva kuphakama umcabango: β€œIngabe lokhu kunjalo ngempela?”

I-Google ithi ubulula be-Go yindawo yayo yokuthengisa futhi ulimi lwakhelwe ukukhiqiza okuphezulu emaqenjini amakhulu, kodwa ngiyakungabaza. Kukhona izici ezingekho noma ezinemininingwane ngokweqile. Futhi konke ngenxa yokuntuleka kokwethemba konjiniyela, ngomcabango wokuthi abakwazi ukwenza noma yini efanele. Lesi sifiso sokwenza izinto zibe lula kwaba yisinqumo esihlakaniphile sabaklami bolimi, futhi ukuze siqonde ngokugcwele ukuthi kungani sasidingeka, kufanele siqonde ukugqugquzelwa konjiniyela kanye nalokho ababezama ukukufeza ku-Go.

Pho kungani yenziwa yalula kangaka? Nazi izingcaphuno ezimbalwa Rob Pike (cishe.: omunye wabadali be-Go Language):

Iphuzu elibalulekile lapha ukuthi abahleli bethu (cishe.: Abasebenzisa iGoogle) ababona abacwaningi. Njengomthetho, bancane kakhulu, beza kithi ngemva kokufunda, mhlawumbe bafunde i-Java, noma i-C / C ++, noma i-Python. Abakwazi ukuqonda ulimi olukhulu, kodwa ngesikhathi esifanayo sifuna ukuthi bakhe isofthiwe enhle. Yingakho ulimi lwabo kufanele lube lula kubo ukuluqonda nokufunda.
 
Kufanele ajwayele, acishe afane noC. Abahleli bezinhlelo abasebenza kwa-Google baqala imisebenzi yabo kusenesikhathi futhi bajwayelene kakhulu nezilimi zenqubo, ikakhulukazi umndeni wakwa-C. Isidingo sokukhiqiza okusheshayo olimini olusha lokuhlela sisho ukuthi ulimi akumele lube lukhuni kakhulu.

Ini? Ngakho-ke uRob Pike empeleni uthi abathuthukisi bakwaGoogle abalungile kangako, yingakho bedale ulimi lwezilima (cishe.: dumbe phansi) ukuze bakwazi ukwenza okuthile. Hlobo luni lokuzikhukhumeza kozakwenu? Bengihlala ngikholelwa ukuthi onjiniyela be-Google bakhethwe ngesandla kwabakhanya kakhulu nabahamba phambili eMhlabeni. Ngokuqinisekile bangakwazi ukusingatha okuthile okunzima kakhulu?

Izinto zobuciko ezilula ngokweqile

Ukuba lula kuwumgomo ofanelekayo kunoma yimuphi umklamo, futhi ukuzama ukwenza into elula kunzima. Kodwa-ke, lapho uzama ukuxazulula (noma ngisho nokuveza) izinkinga eziyinkimbinkimbi, ngezinye izikhathi ithuluzi eliyinkimbinkimbi liyadingeka. Ukuxaka nokuxaka akuzona izici ezingcono kakhulu zolimi lokuhlela, kodwa kunendawo emaphakathi lapho ulimi lungakha izifinyezo ezinhle okulula ukuzifunda nokuzisebenzisa.

Ayivezi kakhulu

Ngenxa yokuzibophezela kwayo ekwenzeni lula, i-Go ayinazo izakhiwo ezithathwa njengezendalo kwezinye izilimi. Lokhu kungase kubonakale kuwumqondo omuhle ekuqaleni, kodwa ekusebenzeni kubangela ikhodi ye-verbose. Isizathu salokhu kufanele sibe sobala - kudingeka kube lula konjiniyela ukuthi bafunde ikhodi yabanye abantu, kodwa empeleni lezi zindlela ezilula zilimaza kuphela ukufunda. Azikho izifinyezo ku-Go: kuningi noma lutho.

Isibonelo, insiza ye-console efunda i-stdin noma ifayela elisuka ku-agumenti yomugqa womyalo ingabukeka kanje:

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

Nakuba le khodi iphinde izame ukuba okuvamile ngangokunokwenzeka, i-verbosity ephoqelelwe ye-Go ingena endleleni, futhi ngenxa yalokho, ukuxazulula inkinga elula kubangela inani elikhulu lekhodi.

Lapha, isibonelo, isisombululo senkinga efanayo ku 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);
    }
}

Futhi ubani ofundeka kakhulu manje? Ngizonikeza u-D ivoti lami. Ikhodi yakhe ifundeka kakhulu ngoba uchaza izenzo ngokucacile. D isebenzisa imiqondo eyinkimbinkimbi kakhulu (cishe.: olunye uhlelo lokusebenza ΠΈ amaphethini) kunesibonelo se-Go, kodwa empeleni akukho lutho oluyinkimbinkimbi ngokuwaqonda.

Isihogo sokukopisha

Isiphakamiso esidumile sokuthuthukisa i-Go sijwayelekile. Lokhu kuzosiza okungenani ukugwema ukukopishwa okungadingekile kwekhodi ukusekela zonke izinhlobo zedatha. Isibonelo, umsebenzi wokufingqa uhlu lwamanani aphelele ungenziwa ngenye indlela ngaphandle kokukopisha-unamathisele umsebenzi wawo oyisisekelo ohlotsheni lwenombolo ngayinye; ayikho enye indlela:

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

Futhi lesi sibonelo asisebenzi nasezinhlotsheni ezisayiniwe. Le ndlela yephula ngokuphelele umgomo wokungaziphindi (Dry), enye yezimiso ezidume kakhulu nezisobala, ukungazinaki okungumthombo wamaphutha amaningi. Kungani u-Go enza lokhu? Lesi isici esibi solimi.

Isibonelo esifanayo ku-D:

import std.stdio;
import std.algorithm;

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

Simple, nenhle futhi iqonde iphuzu. Umsebenzi osetshenziswe lapha ngu reduce ohlotsheni lwesifanekiso nesilandiso. Yebo, lokhu kuphinde kube nzima kakhulu kunenguqulo ye-Go, kodwa akunzima kangako ukuthi abahleli bohlelo abahlakaniphile bakuqonde. Isiphi isibonelo okulula ukusigcina futhi kulula ukusifunda?

Uhlobo olulula lokudlula uhlelo

Ngicabanga ukuthi abahleli bezinhlelo ze-Go befunda lokhu bazobe bekhihliza amagwebu bese bememeza, β€œUkwenza kabi!” Nokho, kukhona enye indlela yokwenza umsebenzi ojwayelekile kanye nezinhlobo, kodwa iphula ngokuphelele uhlelo lohlobo!

Bheka lesi sibonelo solimi oluwubuwula ukulungisa inkinga:

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

Lokhu kuqaliswa Reduce yayibolekiwe esihlokweni I-Idiomatic generics ku-Go (cishe.: Angikwazanga ukuthola ukuhumusha, ngizojabula uma usiza ngalokhu). Hhayi-ke, uma kuyizisho, ngingakuzonda ukubona isibonelo esingesona isisho. Ukusetshenziswa interface{} - i-farce, futhi ngolimi iyadingeka kuphela ukudlula ukuthayipha. Lesi isixhumi esibonakalayo esingenalutho futhi zonke izinhlobo ziyakusebenzisa, okuvumela inkululeko ephelele yawo wonke umuntu. Lesi sitayela sokuhlela sibi kakhulu, futhi akugcini lapho. Imisebenzi ye-Acrobatic efana nalezi idinga ukusetshenziswa kokubonisa isikhathi sokusebenza. Ngisho noRob Pike akabathandi abantu abahlukumeza lokhu, njengoba esho kweminye yemibiko yakhe.

Leli ithuluzi elinamandla okufanele lisetshenziswe ngokuqapha. Kufanele kugwenywe ngaphandle uma kunesidingo.

Ngingathatha izifanekiso zika-D esikhundleni salo mbhedo. Umuntu angakusho kanjani lokho interface{} efundeka kakhudlwana noma ngisho nohlobo oluphephile?

Izinkinga Zokuphathwa Kokuncika

I-Go inohlelo lokuncika olwakhelwe ngaphakathi olwakhelwe phezu kwabahlinzeki bokusingatha abadumile I-VCS. Amathuluzi afika ne-Go azi mayelana nalezi zinsizakalo futhi angadawuniloda, akhe, futhi afake ikhodi kusuka kuwo ngokushesha nje. Nakuba lokhu kukuhle, kukhona iphutha elikhulu ekwenzeni inguqulo! Yebo, kuyiqiniso ukuthi ungathola ikhodi yomthombo kumasevisi afana ne-github noma i-bitbucket usebenzisa amathuluzi we-Go, kodwa awukwazi ukucacisa inguqulo. Futhi futhi ubulula ngezindleko eziwusizo. Angikwazi ukuqonda umqondo wesinqumo esinjalo.

Ngemva kokubuza imibuzo mayelana nesixazululo sale nkinga, ithimba lokuthuthukisa i-Go lidale uchungechunge lweforamu, ebichaza ukuthi bazobhekana kanjani nalolu daba. Isincomo sabo bekuwukumane ukopishe yonke inqolobane kuphrojekthi yakho ngolunye usuku bese uyishiya β€œnjengoba injalo.” Bacabangani? Sinezinhlelo ezimangalisayo zokulawula inguqulo ezinokumaka okuhle nokusekelwa kwenguqulo abadali be-Go abangazinaki futhi bamane bakopishe ikhodi yomthombo.

Imithwalo yamasiko evela kwa-Xi

Ngokubona kwami, i-Go yathuthukiswa abantu ababesebenzise u-C impilo yabo yonke kanye nalabo ababengafuni ukuzama into entsha. Ulimi lungachazwa ngokuthi C ngamasondo engeziwe(imvelaphi.: amasondo okuqeqesha). Ayikho imibono emisha kuwo, ngaphandle kokusekelwa kokufana (okuyinto, ngendlela, emangalisayo) futhi lokhu kuyihlazo. Unokufana okuhle kakhulu ngolimi olungasebenziseki, olukhubazekile.

Enye inkinga edala ukuthi i-Go iwulimi lwenqubo (njengokwesabeka okuthulile kwe-C). Ugcina ngokubhala ikhodi ngesitayela senqubo esizwakala siyisidala futhi siphelelwe yisikhathi. Ngiyazi ukuthi ukuhlela okugxile entweni akulona ichashazi elisiliva, kodwa kungaba kuhle ukukwazi ukukhipha imininingwane ibe izinhlobo nokuhlinzeka nge-encapsulation.

Ubulula ukuze kuzuze wena

I-Go yenzelwe ukuthi ibe lula futhi iphumelele kulowo mgomo. Yayibhalelwe abahleli bezinhlelo ababuthakathaka, besebenzisa ulimi oludala njengesifanekiso. Iza iphelele ngamathuluzi alula okwenza izinto ezilula. Kulula ukufunda futhi kulula ukuyisebenzisa.

Inezwi ngokwedlulele, ayihlaba umxhwele, futhi ayilungile kubahleli bezinhlelo abahlakaniphile.

Бпасибо mersinvald ukuhlela

Source: www.habr.com

Engeza amazwana