Kutheni uYilo lokuHamba lungalunganga kwiiNkqubo ezihlakaniphile

Kwiinyanga ezidlulileyo bendisebenzisa iGo ukuphumeza. Ubungqina beNgqondo (malunga.: ikhowudi yokuvavanya ukusebenza kombono) ngexesha lakhe lokukhululeka, ngokuyinxenye ukufunda ulwimi lweprogram ngokwayo. Iinkqubo ngokwazo zilula kakhulu kwaye aziyiyo injongo yeli nqaku, kodwa amava okusebenzisa iGo ngokwawo afanelwe amagama ambalwa malunga nalo. Hamba uthembisa ukuba (malunga.: inqaku elibhalwe ngo-2015) ulwimi oludumileyo lwekhowudi enobungozi. Ulwimi lwenziwe nguGoogle, apho lusetyenziswa ngokusebenzayo. Ngamazantsi, ndicinga ngokunyanisekileyo ukuba uyilo lolwimi lwe-Go lubi kubadwelisi benkqubo abakrelekrele.

Yenzelwe abadwelisi benkqubo ababuthathaka?

Ukuhamba kulula kakhulu ukuyifunda, kulula kangangokuba intshayelelo yandithatha ngolunye urhatya, emva koko ndikwazile ukwenza ikhowudi ngokunemveliso. Incwadi endandidla ngokuyifunda ethi Go Intshayelelo yeNkqubo kwiGo (uguqulelo), iyafumaneka kwi-intanethi. Incwadi, njengekhowudi yomthombo weGo ngokwayo, kulula ukuyifunda, inemizekelo emihle yekhowudi, kwaye iqulethe malunga namaphepha angama-150 anokufundwa ngexesha elinye. Oku kulula kuyahlaziya ekuqaleni, ngakumbi kwihlabathi lenkqubo elizaliswe bubuchwephesha obuntsokothileyo. Kodwa ekugqibeleni, kungekudala okanye kamva kuvela ingcamango: β€œNgaba oku kunjalo ngokwenene?”

UGoogle uthi ukulula kweGo yindawo yakhe yokuthengisa kwaye ulwimi lwenzelwe imveliso ephezulu kumaqela amakhulu, kodwa ndiyathandabuza. Kukho iimpawu ezilahlekileyo okanye ezichazwe ngokugqithisileyo. Kwaye konke ngenxa yokungathembeki kubaphuhlisi, kunye nokucinga ukuba abakwazi ukwenza nantoni na ngokufanelekileyo. Lo mnqweno wokulula wawusisigqibo esinengqiqo ngabaqulunqi bolwimi, kwaye ukuze siqonde ngokupheleleyo ukuba kutheni bekufuneka, kufuneka siqonde inkuthazo yabaphuhlisi kunye noko bebezama ukufezekisa kwi-Go.

Ngoko kutheni yenziwe yalula kangaka? Nazi izicatshulwa ezimbalwa Rob Pike (malunga.: omnye wabaqulunqi bolwimi lwesiGo):

Inqaku eliphambili apha kukuba abadwelisi bethu (malunga.: abasebenzisi bakaGoogle) asingabo abaphandi. Bona, njengomthetho, bancinci kakhulu, beza kuthi emva kokufunda, mhlawumbi bafunda iJava, okanye iC / C ++, okanye iPython. Abakwazi ukuqonda ulwimi olukhulu, kodwa kwangaxeshanye sifuna ukuba benze isoftware elungileyo. Yiyo loo nto ulwimi lwabo kufuneka lube lula kubo ukuluqonda nokufunda.
 
Ufanele ukuba uqhelene, athethe ngokufana noC. Abadwelisi benkqubo abasebenza kuGoogle baqala imisebenzi yabo kwangoko kwaye baqhelene kakhulu neelwimi zenkqubo, ngakumbi usapho lwakwaC. Imfuno yemveliso ekhawulezileyo kulwimi olutsha lokuprograma ithetha ukuba ulwimi akufuneki lube lukhulu kakhulu.

Intoni? Ke uRob Pike ngokusisiseko uthi abaphuhlisi kuGoogle abalunganga kangako, yiyo loo nto bedale ulwimi lwezidenge (malunga.: dumbe down) ukuze bakwazi ukwenza into. Luhlobo luni lokuzigwagwisa kumaqabane akho? Bendihlala ndikholelwa ukuba abaphuhlisi bakaGoogle bakhethwe ngesandla kwezona ziqaqambileyo nezibalaseleyo eMhlabeni. Ngokuqinisekileyo banokusingatha into enzima ngakumbi?

Izinto ezenziwe ngobulula obugqithisileyo

Ukulula kuyinjongo efanelekileyo kuyo nayiphi na idizayini, kwaye ukuzama ukwenza into elula kunzima. Nangona kunjalo, xa uzama ukusombulula (okanye ukuveza) iingxaki ezinzima, ngamanye amaxesha isixhobo esinzima siyafuneka. Ukuntsokotha kunye nokuntsonkotha ayizizo ezona mpawu zibalaseleyo zolwimi lwenkqubo, kodwa kukho indawo ephakathi apho ulwimi lunokudala ama-abstracts amahle ekulula ukuyiqonda nokusetyenziswa.

Ayibonakali kakhulu

Ngenxa yokuzinikela kwayo kubulula, iGo ayinazo izakhiwo ezibonwa njengendalo kwezinye iilwimi. Oku kunokubonakala ngathi licebo elilungileyo ekuqaleni, kodwa ekusebenzeni kukhokelela kwikhowudi ye-verbose. Isizathu soku kufuneka sicace - kufuneka kube lula kubaphuhlisi ukuba bafunde ikhowudi yabanye abantu, kodwa eneneni ezi zilula zonakalise ukufundeka. Akukho zishunqulelo kuGo: nokuba kuninzi okanye akukho nto.

Umzekelo, into eluncedo yeconsole efunda i-stdin okanye ifayile esuka kwiingxoxo zomgca womyalelo inokujongeka ngolu hlobo:

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

Nangona le khowudi iphinda izame ukuba ngokubanzi ngokusemandleni, i-verbosity enyanzelwayo ye-Go ingena endleleni, kwaye ngenxa yoko, ukusombulula ingxaki elula kubangela inani elikhulu lekhowudi.

Apha, umzekelo, sisisombululo kwingxaki efanayo kwi 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);
    }
}

Kwaye ngubani ofundeka ngakumbi ngoku? Ndiza kuvotela uD. Ikhowudi yakhe ifundeka ngakumbi njengoko echaza izenzo ngokucacileyo ngakumbi. D usebenzisa iikhonsepthi ezinzima kakhulu (malunga.: umnxeba ongomnye womsebenzi ΠΈ iipateni) kunomzekelo weGo, kodwa akukho nto inzima malunga nokubaqonda.

Isihogo sokukopa

Ingcebiso edumileyo yokuphucula i-Go yinto eqhelekileyo. Oku kuya kunceda ubuncinane ukuphepha ukukopa okungafunekiyo kwekhowudi ukuxhasa zonke iintlobo zedatha. Umzekelo, umsebenzi wokushwankathela uluhlu lwamanani apheleleyo unokuphunyezwa nangayiphi na enye indlela ngaphandle kokukopa-uncamathisele umsebenzi wawo osisiseko kudidi ngalunye olupheleleyo, 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))
}

Kwaye lo mzekelo awusebenzi nakwiintlobo ezisayiniweyo. Le ndlela iwaphula ngokupheleleyo umgaqo wokungaziphindi (YOMA), omnye weyona migaqo idumileyo necacileyo, ukutyeshela oko kungumthombo weempazamo ezininzi. Kutheni uGoo esenza le nto? Lo ngumba ombi wolwimi.

Umzekelo ofanayo ku-D:

import std.stdio;
import std.algorithm;

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

Ilula, intle kwaye ithe ngqo kwinqanaba. Umsebenzi osetyenziswe apha ngu reduce kuhlobo lwetemplate kunye nesivisa. Ewe, oku kwakhona kuntsonkothile ngakumbi kunenguqulelo yeGo, kodwa akunzima kangako kubadwelisi benkqubo abakrelekrele ukuba bayiqonde. Nguwuphi umzekelo ekulula ukuwugcina kwaye kulula ukuwufunda?

Indlela yokudlula elula yohlobo

Ndicinga ukuba abadwelisi benkqubo be-Go befunda le nto baya kuba namagwebu emlonyeni kwaye bakhale, "Uyenza kakubi!" Ewe, kukho enye indlela yokwenza umsebenzi wegeneric kunye neentlobo, kodwa iyaphula ngokupheleleyo inkqubo yohlobo!

Jonga kulo mzekelo wokulungisa ulwimi obudenge ukulungisa ingxaki:

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

Oku kuphunyezwa Reduce ibibolekiwe kwinqaku Idiomatic generics kwiGo (malunga.: Andikwazanga ukufumana inguqulelo, ndiya kuvuya ukuba unceda ngale nto). Ewe, ukuba i-idiomatic, ndingathanda ukubona umzekelo ongeyonyani. Ukusetyenziswa interface{} - ifarce, kwaye ngolwimi ifuneka kuphela ukudlula ukuchwetheza. Olu lujongano olungenanto kwaye zonke iintlobo ziyalusebenzisa, luvumela inkululeko epheleleyo kuye wonke umntu. Le ndlela yokucwangcisa imbi kakhulu, kwaye akuphelelanga apho. Imigibe yeAcrobatic efana nale ifuna ukusetyenziswa komboniso wexesha lokubaleka. Nditsho noRob Pike akabathandi abantu abasebenzisa kakubi oku, njengoko watshoyo kwenye yeengxelo zakhe.

Esi sisixhobo esinamandla ekufuneka sisetyenziswe ngononophelo. Ifanele iphetshwe ngaphandle kokuba kuyimfuneko ngokungqongqo.

Ndingathatha itemplates zikaD endaweni yale mbudane. Angatsho njani umntu lonto interface{} efundeka ngakumbi okanye nkqu nokuchwetheza ukhuseleko?

Ooyeha boLawulo lokuXhomekeka

I-Go inenkqubo yokuxhomekeka eyakhelwe-ngaphakathi eyakhelwe phezulu kubanikezeli abaziwayo bokubamba I-VCS. Izixhobo eziza kunye ne-Go ziyazi malunga nezi nkonzo kwaye zinokukhuphela, ukwakha, kunye nokufaka ikhowudi kuzo kwi-swoop enye. Ngelixa oku kukuhle, kukho isiphene esikhulu ngoguqulelo! Ewe, kuyinyaniso ukuba unokufumana ikhowudi yomthombo kwiinkonzo ezifana ne-github okanye i-bitbucket usebenzisa izixhobo ze-Go, kodwa awukwazi ukukhankanya uguqulelo. Kwaye kwakhona ukulula ngeendleko zokusebenziseka. Andikwazi ukuqonda ingqiqo yesigqibo esinjalo.

Emva kokubuza imibuzo malunga nesisombululo kule ngxaki, iqela lophuhliso lwe-Go lenze iforum intambo, eyayichaza indlela ababeza kuhlangabezana ngayo nale ngxaki. Ingcebiso yabo yayikukukhuphela yonke indawo yokugcina kwiprojekthi yakho ngenye imini kwaye uyishiye "injalo." Bacinga ntoni? Sineenkqubo ezimangalisayo zolawulo lwenguqulelo enokuthegiswa okukhulu kunye nenkxaso yoguqulelo abangayihoyiyo abadali beGo kwaye bakhuphele ikhowudi yomthombo.

Imithwalo yenkcubeko evela eXi

Ngokoluvo lwam, iGo yaphuhliswa ngabantu ababesebenzisa uC ubomi babo bonke nangabo babengafuni ukuzama into entsha. Ulwimi lunokuchazwa njengo C ngamavili angaphezulu (imvelaphi.: amavili oqeqesho). Akukho mibono emitsha kuyo, ngaphandle kwenkxaso ye-parallelism (leyo, ngendlela, iyamangalisa) kwaye oku kulihlazo. Unokuhambelana okugqwesileyo kulwimi olungasebenzisekiyo, oluqhwalelayo.

Enye ingxaki ye-creaking kukuba i-Go lulwimi lwenkqubo (njengokoyikeka okuthe cwaka kwe-C). Ugqiba ukubhala ikhowudi kwisitayile senkqubo esiziva si-archaic kwaye siphelelwe lixesha. Ndiyazi ukuba inkqubo ejoliswe kwinto ayiyombumbulu yesilivere, kodwa kuya kuba kuhle ukukwazi ukukhupha iinkcukacha kwiintlobo kunye nokubonelela nge-encapsulation.

Ubulula ukwenzela inzuzo yakho

I-Go yenzelwe ukuba ibe lula kwaye iyaphumelela kuloo njongo. Yabhalelwa abaprogram ababuthathaka, besebenzisa ulwimi oludala njenge template. Iza iphelele kunye nezixhobo ezilula zokwenza izinto ezilula. Kulula ukufunda kwaye kulula ukuyisebenzisa.

Ithetha kakhulu, ayichukumisi, kwaye imbi kubadwelisi benkqubo abakrelekrele.

Бпасибо mersinvald yokuhlelwa

umthombo: www.habr.com

Yongeza izimvo