ባለፉት ወራት Go ለትግበራዎች እየተጠቀምኩበት ነው።
ለደካማ ፕሮግራመሮች የተነደፈ?
ሂድ ለመማር በጣም ቀላል ነው፣ መግቢያው አንድ ምሽት ወሰደኝ፣ ከዚያ በኋላ በምርታማነት ኮድ ማድረግ ቻልኩ። ጎ የተማርኩት መጽሐፍ ይባላል
ጎግል የ Go ቀላልነት መሸጫ ነጥቡ ነው ይላል እና ቋንቋው በትልልቅ ቡድኖች ውስጥ ለከፍተኛ ምርታማነት የተነደፈ ነው፣ ግን እጠራጠራለሁ። የጎደሉ ወይም ከልክ በላይ የተዘረዘሩ ባህሪያት አሉ። እና ሁሉም በገንቢዎች ላይ እምነት ስለሌላቸው, ምንም ነገር በትክክል መስራት እንደማይችሉ በማሰብ. ይህ የቀላልነት ፍላጎት በቋንቋው ዲዛይነሮች የተገነዘበ ውሳኔ ነበር፣ እና ለምን እንደሚያስፈልግ ሙሉ በሙሉ ለመረዳት የገንቢዎችን ተነሳሽነት እና በGo ውስጥ ምን ለማግኘት እየሞከሩ እንደነበር መረዳት አለብን።
ታዲያ ለምን ቀላል ሆነ? ሁለት ጥቅሶች እነሆ
ዋናው ነጥብ የእኛ ፕሮግራም አውጪዎች (እ.ኤ.አ.)በግምት:
ጎግል ሰሪዎች ) ተመራማሪዎች አይደሉም። እነሱ፣ እንደ አንድ ደንብ፣ በጣም ወጣት ናቸው፣ ከተማሩ በኋላ ወደ እኛ ይመጣሉ፣ ምናልባት ጃቫን፣ ወይም ሲ/ሲ++ን፣ ወይም ፒቲንን ያጠኑ ይሆናል። በጣም ጥሩ ቋንቋ ሊረዱ አይችሉም, ግን በተመሳሳይ ጊዜ ጥሩ ሶፍትዌር እንዲፈጥሩ እንፈልጋለን. ለዚህም ነው ቋንቋቸው በቀላሉ እንዲረዱ እና እንዲማሩ ማድረግ ያለባቸው።
እሱ ጠንቅቆ ማወቅ አለበት፣ በግምት ከሲ ጋር ይመሳሰላል። ጎግል ላይ የሚሰሩ ፕሮግራመሮች ስራቸውን የሚጀምሩት ቀደም ብለው ነው እና በአብዛኛዎቹ የሥርዓት ቋንቋዎችን በተለይም የC ቤተሰብን ያውቃሉ። በአዲስ የፕሮግራሚንግ ቋንቋ ፈጣን ምርታማነት መስፈርት ቋንቋው በጣም አክራሪ መሆን የለበትም ማለት ነው።
ምንድን? ስለዚህ ሮብ ፓይክ በመሠረቱ ጎግል ላይ ያሉ ገንቢዎች ያን ያህል ጥሩ አይደሉም እያለ ነው ለዛም ነው ለደደቦች ቋንቋ የፈጠሩት (በግምት: dumbed down) የሆነ ነገር ለማድረግ እንዲችሉ። በእራስዎ ባልደረቦችዎ ላይ ምን አይነት እብሪተኛ እይታ ነው? ሁልጊዜም የጉግል ገንቢዎች በምድር ላይ ካሉት በጣም ብሩህ እና ምርጥ ሆነው የተመረጡ ናቸው ብዬ አምናለሁ። በእርግጥ እነሱ የበለጠ አስቸጋሪ ነገርን መቋቋም ይችላሉ?
ከመጠን በላይ ቀላልነት ያላቸው ቅርሶች
ቀላል መሆን በማንኛውም ንድፍ ውስጥ የሚገባ ግብ ነው, እና ቀላል ነገር ለማድረግ መሞከር ከባድ ነው. ሆኖም ግን, ውስብስብ ችግሮችን ለመፍታት (ወይም እንዲያውም ለመግለጽ) ሲሞክር, አንዳንድ ጊዜ ውስብስብ መሣሪያ ያስፈልጋል. ውስብስብነት እና ውስብስብነት የፕሮግራሚንግ ቋንቋ ምርጥ ባህሪያት አይደሉም, ነገር ግን ቋንቋው በቀላሉ ሊረዱት እና ሊጠቀሙባቸው የሚችሉ ውብ ማጠቃለያዎችን መፍጠር የሚችሉበት መካከለኛ ደረጃ አለ.
በጣም ገላጭ አይደለም
ለቀላልነት ባለው ቁርጠኝነት ምክንያት፣ 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 የግዳጅ ቃላቶች መንገድ ላይ ገብተዋል ፣ እናም በዚህ ምክንያት ቀላል ችግርን መፍታት ከፍተኛ መጠን ያለው ኮድ ያስከትላል።
እዚህ, ለምሳሌ, በ ውስጥ ለተመሳሳይ ችግር መፍትሄ ነው
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);
}
}
እና አሁን የበለጠ የሚነበብ ማነው? ድምፄን ለዲ እሰጣለሁ የእሱ ኮድ በጣም የሚነበብ ነው ምክንያቱም እሱ ድርጊቶቹን የበለጠ በግልፅ ይገልፃል። D በጣም ውስብስብ ጽንሰ-ሀሳቦችን ይጠቀማል (በግምት:
ገሃነም መኮረጅ
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 ስሪት የበለጠ የተወሳሰበ ነው፣ ነገር ግን ለስማርት ፕሮግራመሮች ለመረዳት ያን ያህል አስቸጋሪ አይደለም። የትኛውን ምሳሌ ለማቆየት ቀላል እና ለማንበብ ቀላል ነው?
ቀላል ዓይነት የስርዓት ማለፊያ
የ 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
ከጽሑፉ ተበድሯል። interface{}
- ፋሬስ ፣ እና በቋንቋው መፃፍን ለማለፍ ብቻ ያስፈልጋል። ይህ ባዶ በይነገጽ ነው እና ሁሉም ዓይነቶች ይተገብራሉ, ይህም ለሁሉም ሰው ሙሉ ነፃነትን ይፈቅዳል. ይህ የፕሮግራም አወጣጥ ዘይቤ በጣም አስቀያሚ ነው፣ እና ያ ብቻ አይደለም። እንደነዚህ ያሉት የአክሮባቲክ ስራዎች የሩጫ ጊዜ ነጸብራቅ መጠቀምን ይጠይቃሉ። ሮብ ፓይክ እንኳን ይህን አላግባብ የሚጠቀሙ ግለሰቦችን አይወድም በአንዱ ዘገባዎቹ ላይ እንደገለፀው።
ይህ በጥንቃቄ ጥቅም ላይ መዋል ያለበት ኃይለኛ መሳሪያ ነው. በጣም አስፈላጊ ካልሆነ በስተቀር መወገድ አለበት.
ከዚህ ከንቱነት ይልቅ ዲ አብነቶችን እወስድ ነበር። አንድ ሰው እንዴት እንዲህ ይላል interface{}
የበለጠ ሊነበብ የሚችል ወይም ደህንነቱ በተጠበቀ ሁኔታ ይተይቡ?
የጥገኛ አስተዳደር ወዮታ
Go በታዋቂ አስተናጋጅ አቅራቢዎች ላይ አብሮ የተሰራ የጥገኝነት ስርዓት አለው።
ለዚህ ችግር መፍትሄ ጥያቄዎችን ከጠየቁ በኋላ የ Go ልማት ቡድን ፈጠረ
ከ Xi የባህል ሻንጣ
በእኔ አስተያየት Go የተገነባው ህይወታቸውን ሙሉ ሲን በተጠቀሙ እና አዲስ ነገር መሞከር በማይፈልጉ ሰዎች ነው። ቋንቋው ከተጨማሪ ጎማዎች (C) ጋር ሊገለፅ ይችላል።ኦሪጅ:
ሌላው የሚያስደነግጥ ችግር ሂድ የሥርዓት ቋንቋ ነው (እንደ ዝም አስፈሪ የ C)። እርስዎ ጥንታዊ እና ጊዜ ያለፈበት በሚመስል የሥርዓት ዘይቤ ኮድ በመጻፍ ይጨርሳሉ። የነገር ተኮር ፕሮግራሚንግ የብር ጥይት እንዳልሆነ አውቃለሁ ነገር ግን ዝርዝሩን ወደ ዐይነት ማጠቃለል እና ማቀፊያ ማቅረብ መቻል በጣም ጥሩ ነው።
ለራስህ ጥቅም ቀላልነት
ሂድ ቀላል እንዲሆን ታስቦ ነበር እና ግቡ ላይ ተሳክቶለታል። የድሮ ቋንቋን እንደ አብነት በመጠቀም ለደካማ ፕሮግራመሮች የተጻፈ ነው። ቀላል ነገሮችን ለመስራት በቀላል መሳሪያዎች የተሟላ ነው. ለማንበብ ቀላል እና ለመጠቀም ቀላል ነው።
እጅግ በጣም የቃላት አነጋገር፣ የማያስደስት እና ለብልጥ ፕሮግራመሮች መጥፎ ነው።
Спасибо
ምንጭ: hab.com