دلته مهم ټکی دا دی چې زموږ پروګرام کونکي (نږدې: ګوګلرز) څیړونکي نه دي. دوی، د یوې قاعدې په توګه، خورا ځوان دي، موږ ته د مطالعې وروسته راځي، شاید دوی جاوا، یا C/C++، یا Python مطالعه کړي. دوی په عالي ژبه نه پوهیږي، مګر په ورته وخت کې موږ غواړو چې دوی ښه سافټویر جوړ کړي. له همدې امله د دوی ژبه باید د پوهیدو او زده کولو لپاره اسانه وي.
هغه باید آشنا وي، تقریبا د C سره ورته خبرې کوي. هغه پروګرام کونکي چې په ګوګل کې کار کوي خپل کیریر ژر پیل کوي او ډیری یې د طرزالعمل ژبو سره بلد دي، په ځانګړې توګه د C کورنۍ. په نوې برنامه ژبه کې د ګړندي تولید اړتیا پدې معنی ده چې ژبه باید خورا افراطي نه وي.
ساده کیدل په هر ډیزاین کې د پام وړ هدف دی، او د یو څه ساده کولو هڅه کول ستونزمن دي. په هرصورت، کله چې د پیچلو ستونزو حل کولو (یا حتی څرګندولو) هڅه کوي، ځینې وختونه پیچلې وسیلې ته اړتیا وي. پیچلتیا او پیچلتیا د پروګرام کولو ژبې غوره ځانګړتیاوې ندي، مګر یو منځنی ځای شتون لري چې ژبه کولی شي په زړه پورې لنډیزونه رامینځته کړي چې د پوهیدو او کارولو لپاره اسانه وي.
ډیر څرګند نه دی
د سادګۍ لپاره د دې ژمنې له امله، Go داسې جوړښتونه نلري چې په نورو ژبو کې طبیعي ګڼل کیږي. دا ممکن په لومړي سر کې د یو ښه نظر په څیر ښکاري، مګر په عمل کې دا د فعل کوډ پایلې لري. د دې دلیل باید څرګند وي - دا باید د پراختیا کونکو لپاره د نورو خلکو کوډ لوستل اسانه وي ، مګر په حقیقت کې دا ساده کول یوازې لوستلو ته زیان رسوي. په Go کې هیڅ لنډیز شتون نلري: یا ډیر یا هیڅ شی.
د مثال په توګه ، د کنسول یوټیلیټ چې stdin لوستل کوي یا د کمانډ لاین دلیلونو څخه فایل به داسې ښکاري:
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)
}
که څه هم دا کوډ هڅه کوي د امکان تر حده عمومي وي، د Go جبري فعل په لاره کې راځي، او د پایلې په توګه، د یوې ساده ستونزې حل کول د کوډ لوی مقدار پایله کوي.
او اوس څوک ډیر لوستل کیږي؟ زه به خپله رایه D ته ورکوم. د هغه کوډ ډیر د لوستلو وړ دی ځکه چې هغه عملونه په روښانه ډول بیانوي. D ډیر پیچلي مفهومونه کاروي (نږدې: د بدیل فنکشن کال и نمونهد Go مثال په پرتله، مګر د دوی د پوهیدو په اړه واقعیا هیڅ پیچلي ندي.
د کاپي کولو دوزخ
د Go ښه کولو لپاره یو مشهور وړاندیز عموميت دی. دا به لږترلږه د ټولو ډیټا ډولونو ملاتړ لپاره د کوډ غیر ضروري کاپي کولو څخه مخنیوي کې مرسته وکړي. د مثال په توګه، د انټیجرونو لیست لنډولو لپاره یو فنکشن د هر انټیجر ډول لپاره د دې بنسټیز فعالیت کاپي کولو پرته په بل ډول پلي کیدی نشي؛ بله لاره نشته:
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))
}
او دا مثال حتی د لاسلیک شوي ډولونو لپاره کار نه کوي. دا طریقه په بشپړه توګه د خپل ځان د نه تکرار کولو اصول څخه سرغړونه کوي (وچ)، یو له خورا مشهور او څرګند اصولو څخه، له پامه غورځول چې د ډیری غلطیو سرچینه ده. ولې دا کار کوي؟ دا د ژبې یو ناوړه اړخ دی.
په ورته مثال کې:
import std.stdio;
import std.algorithm;
void main(string[] args)
{
[1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}
ساده، ښکلی او مستقیم ټکي ته. دلته کارول شوی فعالیت دی reduce د ټیمپلیټ ډول او وړاندوینې لپاره. هو، دا بیا د Go نسخه څخه ډیر پیچلی دی، مګر د سمارټ پروګرام کونکو لپاره پوهیدل دومره ستونزمن ندي. کوم مثال د ساتلو لپاره اسانه او لوستل یې اسانه دي؟
ساده ډول سیسټم بای پاس
زه تصور کوم چې د دې لوستلو پروګرام کونکي به په خوله کې فنګس کوي او چیغې به یې کړي، "تاسو دا غلط کوئ!" ښه ، د عمومي فعالیت او ډولونو رامینځته کولو بله لاره شتون لري ، مګر دا په بشپړ ډول د ډول سیسټم ماتوي!
د ستونزې په شاوخوا کې د کار کولو لپاره د احمق ژبې فکس دې مثال ته یو نظر وګورئ:
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)
}
دا تطبیق Reduce له مقالې څخه پور اخیستل شوی په Go کې محاورې جنریک (نږدې: ما ژباړه ونه موندله، زه به خوښ شم که تاسو پدې کې مرسته وکړئ). ښه، که دا محاوره وي، زه به د غیر محاورې مثال لیدلو څخه نفرت وکړم. کارول interface{} - یو طنز، او په ژبه کې دا یوازې د ټایپ کولو څخه د وتلو لپاره اړین دی. دا یو خالي انٹرفیس دی او ټول ډولونه یې پلي کوي ، د هرچا لپاره بشپړ آزادي اجازه ورکوي. د برنامه کولو دا سټایل د دوزخ په څیر بد دی ، او دا ټول ندي. د دې په څیر اکروباټیک فیټونه د منډې وخت انعکاس کارولو ته اړتیا لري. حتی روب پایک هغه کسان نه خوښوي چې دا ناوړه ګټه پورته کوي، لکه څنګه چې هغه په خپل راپور کې یادونه کړې.
دا یو پیاوړی وسیله ده چې باید په احتیاط سره وکارول شي. دا باید مخنیوی وشي پرته لدې چې په کلکه اړتیا وي.
زه به د دې بې معنی پر ځای D ټیمپلیټونه واخلم. دا څنګه څوک ویلای شي interface{} ډیر د لوستلو وړ یا حتی خوندي ډول ډول؟
د انحصاري مدیریت ستونزې
Go د مشهور کوربه توب چمتو کونکو په سر کې جوړ شوی انحصار سیسټم لري VCS. هغه وسیلې چې د Go سره راځي د دې خدماتو په اړه پوهیږي او کولی شي له دوی څخه کوډ ډاونلوډ ، جوړ او نصب کړي په یوځل کې. پداسې حال کې چې دا عالي دی ، د نسخې کولو سره لوی نیمګړتیا شتون لري! هو، دا ریښتیا ده چې تاسو د Go وسیلو په کارولو سره د ګیتوب یا بټ بکټ په څیر خدماتو څخه سرچینه کوډ ترلاسه کولی شئ، مګر تاسو نشئ کولی نسخه مشخص کړئ. او بیا د ګټورتوب په قیمت کې سادگي. زه د داسې پریکړې په منطق نه پوهیږم.
د دې ستونزې د حل په اړه د پوښتنو پوښتنو وروسته، د Go پرمختیا ټیم جوړ کړ د فورم موضوع، کوم چې دا په ګوته کړه چې دوی څنګه د دې مسلې شاوخوا ته ځي. د دوی سپارښتنه دا وه چې په ساده ډول یوه ورځ ټوله ذخیره ستاسو په پروژه کې کاپي کړئ او "لکه څنګه چې وي." دوی څه فکر کوي؟ موږ د عالي ټاګ کولو او نسخې ملاتړ سره د حیرانتیا نسخه کنټرول سیسټمونه لرو چې د Go جوړونکي له پامه غورځوي او یوازې د سرچینې کوډ کاپي کوي.