Aisea e leaga ai le Go Design mo Tagata Polokalame Atamai

I masina ua tuanaʻi sa ou faʻaogaina le Go mo faʻatinoga. Faamaoniga o le Manatu (tusa.: code e suʻe ai le faʻatinoga o se manatu) i lona taimi avanoa, o se vaega e suʻesuʻe ai le gagana polokalame lava ia. O polokalame lava ia e matua faigofie lava ma e le o le faʻamoemoega o lenei tusiga, ae o le poto masani o le faʻaaogaina o le Go lava ia e tatau ai ni nai upu e uiga i ai. Alu folafola e avea (tusa.: tusiga na tusia i le 2015) o se gagana lauiloa mo tulafono faʻapitoa e mafai ona faʻaogaina. O le gagana na faia e Google, lea o lo'o fa'aaogaina malosi ai. O le laina pito i lalo, ou te manatu faamaoni o le mamanu o le gagana Go e leaga mo tagata fai polokalame atamai.

Fuafua mo tagata fai polokalame vaivai?

O le alu e matua faigofie lava ona aʻoaʻoina, e matua faigofie lava o le folasaga na ave ai aʻu i se tasi afiafi, mulimuli ane ua mafai ona ou faʻamaonia lelei. O le tusi sa masani ona ou aʻoaʻoina le Go e taʻua O se Folasaga i Polokalama i Go (faaliliuga), e maua i luga ole laiga. O le tusi, e pei o le Go source code lava ia, e faigofie ona faitau, o loʻo i ai faʻataʻitaʻiga lelei, ma e aofia ai le tusa ma le 150 itulau e mafai ona faitau i le taimi e tasi. O lenei faigofie e faʻafouina i le taimi muamua, aemaise lava i se lalolagi polokalame ua tumu i tekinolosi faʻalavelave. Ae i le iʻuga, e leʻi umi pe mulimuli ane ua tulaʻi mai se manatu: “E moni ea lenei mea?”

Google fai mai Go's faigofie o lona faʻatauga ma o le gagana ua mamanuina mo le maualuga o le gaosiga i 'au tetele, ae ou te masalosalo i ai. O lo'o iai fa'aaliga e misi pe ova'a fa'amatalaga. Ma o mea uma ona o le leai o se faʻalagolago i tagata atiae, ma le manatu e le mafai ona latou faia se mea saʻo. O lenei manaʻoga mo le faʻafaigofie o se filifiliga faʻapitoa a le au tusitala o le gagana, ma ina ia malamalama atoatoa pe aisea na manaʻomia ai, e tatau ona tatou malamalama i le faʻaosofia o le au atinaʻe ma mea na latou taumafai e ausia i Go.

Aisea la na faigofie ai? O nai upusii nei Rob Pike (tusa.: o se tasi na faia fa'atasi le gagana Go):

O le manatu autu iinei o le matou tagata fai polokalame (tusa.: Googlers) e le o ni tagata suʻesuʻe. O i latou, e pei o se tulafono, e laiti, o mai ia i matou pe a uma a latou suʻesuʻega, masalo na latou suʻesuʻeina Java, poʻo C/C++, poʻo Python. E le mafai ona latou malamalama i se gagana lelei, ae i le taimi lava e tasi matou te manana'o latou te faia ni polokalama lelei. O le mafuaaga lena e tatau ai ona faigofie la latou gagana ona malamalama ma aoaoina.
 
E tatau ona masani o ia, e tutusa le tautala ma C. O tagata fai polokalame e galulue i Google e vave amata a latou galuega ma e masani ona masani i gagana fa'atonu, aemaise le aiga C. O le mana'oga mo le vave fa'atupuina i se gagana fa'apolokalame fou o lona uiga e le tatau ona fa'a'ese'ese le gagana.

O le ā? O lea la, o loʻo faʻapea mai Rob Pike o le au atinaʻe i Google e le lelei tele, o le mea lea na latou faia ai se gagana mo vale (tusa.: gugu i lalo) ina ia mafai ona latou faia se mea. O le a le ituaiga vaaiga faasausili i au lava uo? Ou te talitonu i taimi uma o le au atiaʻe a Google e filifilia mai le sili ona lelei ma sili ona lelei ile lalolagi. E mautinoa e mafai ona latou taulimaina se mea e sili atu ona faigata?

Mea fa'atauva'a o le fa'afaigofie tele

O le faigofie o se sini aoga i soo se mamanu, ma o le taumafai e fai se mea faigofie e faigata. Peita'i, pe a taumafai e fo'ia (pe fa'ailoa fo'i) fa'afitauli lavelave, o nisi taimi e mana'omia ai se meafaigaluega lavelave. O le lavelave ma le lavelave e le o ni uiga sili ona lelei o se gagana polokalame, ae o loʻo i ai se ala fiafia e mafai ai e se gagana ona fatuina ni faʻamatalaga mataʻina e faigofie ona malamalama ma faʻaoga.

E le fa'aalia tele

Ona o lana tautinoga i le faigofie, o le Go e leai ni faufale e vaʻaia e masani i isi gagana. Atonu e foliga mai o se manatu lelei i le taimi muamua, ae i le faatinoga e maua ai le verbose code. O le mafuaʻaga o lenei mea e tatau ona manino - e manaʻomia ona faigofie mo le au atinaʻe le faitau tulafono a isi tagata, ae o le mea moni o nei faʻafaigofie e afaina ai le faitau. E leai ni fa'apuupuuga ile Go: pe tele pe leai.

Mo se faʻataʻitaʻiga, o se faʻaoga faʻamafanafanaga e faitau stdin poʻo se faila mai faʻamatalaga laina laina e foliga mai:

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

E ui lava o lenei code o loʻo taumafai foi e faʻasalalau i le mea e mafai ai, o le faʻamalosi faʻamalosi a Go e oʻo i le ala, ma o se taunuuga, o le foia o se faʻafitauli faigofie e maua ai le tele o code.

O iinei, mo se faʻataʻitaʻiga, o se fofo i le faafitauli lava e tasi i 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);
    }
}

Ma o ai e sili atu ona faitau i le taimi nei? O le a ou tuuina atu la'u palota ia D. O lana code e sili atu ona mafai ona faitau aua e sili atu ona manino lona faamatalaina o gaioiga. D fa'aaogaina manatu e sili atu ona lavelave (tusa.: isi vala'au galuega и mamanu) nai lo le Go faʻataʻitaʻiga, ae leai se mea faigata e uiga i le malamalama ia i latou.

Seoli o kopi

O se fautuaga lauiloa mo le faʻaleleia o le Go o le lautele. O le a fesoasoani lea e aloese ai mai le kopiina o le code e lagolagoina uma ituaiga faʻamaumauga. Mo se faʻataʻitaʻiga, o se galuega mo le faʻaputuina o se lisi o numera e le mafai ona faʻatinoina i se isi lava auala nai lo le kopi-faʻapipiʻi lana galuega autu mo ituaiga numera taʻitasi e leai se isi auala:

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

Ma o lenei faʻataʻitaʻiga e le aoga mo ituaiga saini. O lenei faiga e matua solia lava le mataupu faavae o le le toe faia oe lava (mago), o se tasi o mataupu sili ona taʻutaʻua ma manino, e le amanaʻia po o fea e mafua ai le tele o mea sese. Aisea ua faia ai e Go lenei mea? O se itu mata'utia lea o le gagana.

Fa'ata'ita'iga tutusa ile D:

import std.stdio;
import std.algorithm;

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

Faigofie, aulelei ma sa'o i le tulaga. O le galuega o loʻo faʻaaogaina iinei o le reduce mo ituaiga mamanu ma predicate. Ioe, e sili atu le lavelave lenei nai lo le Go version, ae le faigata tele mo tagata fai polokalame atamai ona malamalama i ai. O le fea faʻataʻitaʻiga e faigofie ona tausia ma faigofie ona faitau?

Fa'asolo faiga faiga faigofie

Ou te vaai faalemafaufau atu i le au fai polokalame o le Go o lo o faitau i lenei mea o le a puaoa le gutu ma ee, “Ua e sese!” Ia, o loʻo i ai se isi auala e fai ai se galuega lautele ma ituaiga, ae e matua talepeina ai le ituaiga faiga!

Va'ai i le fa'ata'ita'iga lenei o se gagana fa'avalevalea e fo'ia ai le fa'afitauli:

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

O lenei faatinoga Reduce sa nono mai le tusiga Idiomatic generics i Go (tusa.: E le mafai ona ou mauaina le faaliliuga, ou te fiafia pe a e fesoasoani i lenei mea). Ia, afai o se fa'aupuga, ou te 'ino'ino e va'ai i se fa'ata'ita'iga e le fa'atusa. Fa'aoga interface{} - o se fase, ma i le gagana e manaʻomia naʻo le faʻaogaina o le taina. Ole fa'aoga gaogao lea ma fa'atino uma ituaiga, fa'atagaina le sa'olotoga atoatoa mo tagata uma. O lenei faiga o polokalame e mataga e pei o seoli, ma e le na o le pau lena. Acrobatic fa'apenei e mana'omia ai le fa'aogaina o le fa'ata'ita'iga i le taimi. E oo lava ia Rob Pike e le fiafia i tagata e sauaina lenei mea, e pei ona ia taʻua i se tasi o ana lipoti.

O se meafaigaluega mamana lea e tatau ona faʻaaogaina ma le faʻaeteete. E tatau ona aloese mai ai sei vagana ua matua manaomia.

O le a ou ave faʻataʻitaʻiga D nai lo lenei faʻavalevalea. E mafai faapefea e se tasi ona faapea mai interface{} sili atu ona faitau pe fa'apena saogalemu?

O Talofa o le Pulea Faalagolago

O loʻo i ai se faʻaogaina faʻalagolago i luga o le pito i luga o kamupani talimalo lauiloa VCS. O meafaigaluega e sau ma Go e iloa e uiga i nei auaunaga ma e mafai ona sii mai, fausia, ma faʻapipiʻi le code mai ia i latou i le tasi pa'ū. E ui ina lelei lenei mea, o loʻo i ai se faʻaletonu tele i le faʻaliliuina! Ioe, e moni e mafai ona e mauaina le code source mai auaunaga e pei o le github poʻo le bitbucket e faʻaaoga ai meafaigaluega Go, ae e le mafai ona e faʻamaonia le faʻamatalaga. Ma toe faigofie i le tau o le aoga. E le mafai ona ou malamalama i le mafuaaga o sea faaiuga.

Ina ua uma ona fai ni fesili e uiga i se fofo i lenei faʻafitauli, na faia e le vaega atinaʻe Go fono filo, lea o loʻo faʻamatala mai ai le auala o le a latou foia ai lenei mataupu. O la latou fautuaga o le na o le kopiina o le fale teu oloa atoa i lau poloketi i se tasi aso ma tuʻu ai "pei o iai." O le ā le mea o loo latou mafaufau i ai? O lo'o iai a matou faiga fa'ata'ita'iga mata'ina ma le fa'ailoga lelei ma le fa'aliliuga lagolago e le amana'ia e le au foafoa o le Go ma na'o le kopiina o le code source.

O ato fa'ale-aganu'u mai Xi

I loʻu manatu, Go na atiina ae e tagata na faʻaaogaina C i o latou olaga atoa ma i latou e leʻi manaʻo e faʻataʻitaʻi se mea fou. O le gagana e mafai ona faamatalaina o le C ma isi uili (orig.: uili a'oa'oga). E leai ni manatu fou i totonu, sei vagana ai le lagolago mo le tutusa (lea, i le ala, e matagofie) ma o se mea e maasiasi ai. E iai sau fa'atusa lelei i se gagana pipili e tau le mafai ona fa'aaogaina.

O le isi fa'afitauli fa'afefe o le Go o se gagana fa'atonu (pei o le mata'utia le leoa o le C). E te fa'ai'u i le tusiaina o code i se faiga fa'atonu e lagona le tuai ma tuai. Ou te iloa mea faʻatulagaina polokalame e le o se pulu siliva, ae o le a sili le mafai ona faʻamalamalamaina faʻamatalaga i ituaiga ma tuʻuina atu faʻamatalaga.

Faigofie mo lou lava manuia

O le alu na mamanuina ina ia faigofie ma e manuia i lena sini. Na tusia mo tagata fai polokalame vaivai, faʻaaogaina se gagana tuai e fai ma faʻataʻitaʻiga. E sau atoatoa ma meafaigaluega faigofie e fai ai mea faigofie. E faigofie ona faitau ma faigofie ona faʻaoga.

E matua'i fa'aupuga, e le manaia, ma leaga mo tagata fai polokalame atamai.

Спасибо mersinvald mo teuteuga

puna: www.habr.com

Faaopoopo i ai se faamatalaga