إذا كنت تفكر في البدء في الكتابة على Go ، فإليك ما يجب أن تعرفه

يكتب حيوانك الأليف المفضل على Go ويحصل على أكثر منك ، لكنك لم تفعل ذلك بعد؟ لا تضيع الوقت ... قد تأتي مثل هذه الفكرة للقارئ من وفرة المقالات على Go. يتم عرض بعض الشركات على إعادة التدريب بهذه اللغة. وإذا فكرت في إتقان لغة ، فأنا أريد أن أحذرك. بدلاً من ذلك ، اعرض أشياء غريبة ، وحاول توضيح سببها ، ثم تقرر بنفسك ما إذا كنت بحاجة إلى Go.

قوه هو محمول C


لمن هذه المقالة؟


المقالة مخصصة في المقام الأول لأولئك الأشخاص الذين تعتبر اللغة تعبيرًا مهمًا بالنسبة لهم. وفي الوقت نفسه لأولئك الذين يريدون أن يشعروا بالذهاب.
أنا نفسي مطور C ++ / Python وأستطيع أن أقول أن هذا المزيج هو واحد من الأفضل لاتقان Go. وهنا السبب:

  • غالبًا ما تستخدم Go لكتابة خدمات الواجهة الخلفية ونادرًا ما تستخدم كل شيء آخر. هناك زوجان أكثر شيوعًا للنفس: Java / C # و Python / Ruby. Go ، في رأيي ، يهدف على وجه التحديد إلى أخذ حصة من زوج Python / Ruby.
  • Go يرث سلوكه الغريب على وجه التحديد من الفروق الدقيقة في بناء الجملة C ، والتي ليست واضحة مخفية في اللغة. نظرًا لأن Go لديها نقاط رفض واضحة إلى حد أنك تريد في بعض الأحيان إزالة مترجم Go ونسيانه ، فإن فهم مبادئ C وحقيقة أن Go هي إلى حد ما مجموعة شاملة من C تجعل من الممكن تخفيفها.


ماذا عن زوج Java / C #؟ Go ليس منافسًا لها أبدًا ، على الأقل أثناء صغره (نحن نتحدث عن Go الإصدار 1.11).

ما لن يكون في المقالة


  • لن نقول أن Go سيئة ، لأنها لا تحتوي على ميزة X ، كما هو الحال في اللغة Y. لكل لغة قواعدها الخاصة في اللعبة ، ونهجها الخاصة ومعجبيها. على الرغم من أني أخدع ، بالطبع يجب أن نتحدث عنه.
  • لن نقوم بمقارنة اللغات المترجمة والمترجمة مباشرة.


ماذا سيحدث؟ فقط حالات عدم الراحة المحددة التي تقدمها اللغة في العمل.

الشروع في العمل


مقدمة جيدة لدليل اللغة هو كتاب قصير على الإنترنت مقدمة إلى Go Programming . قراءة أنك سوف تتعثر على ميزات غريبة بسرعة كبيرة. أولاً ، نعطي الدفعة الأولى منهم:

مترجم غريب


يتم دعم الأقواس المصرية فقط
يتم دعم الأقواس المصرية فقط ، أي أن التعليمات البرمجية التالية لا تترجم:
package main

func main()  //  
{

}

, . — .

a := []string{
	"q"  //  ,  
}

-, . , , .

? !
, .
package main

func main() {
	a := []string{
		"q",
	}
	//  ,   
}


, , , , . , . , . .
, . - .

, :
for _, value := range x {
    total += value
}



. .

«»


. , , .

:
« , (..: ) . , , , , Java, C/C++, Python. , , . .»

: Go .

?
var x map[string]int
x["key"] = 10

:
panic: runtime error: assignment to entry in nil map


«» . , ?
tyderh , :
, , , . , .


:
  var i32 int32 = 0
  var i64 int64 = 0
  
  if i64 == i32 {
    
  }

, . Go (!) , , :
package main

import (
	"fmt"
)

func eq(val1 interface{}, val2 interface{}) bool {
	return val1 == val2
}

func main() {
	var i32 int32 = 0
	var i64 int64 = 0
	var in int = 0

	fmt.Println(eq(i32, i64))
	fmt.Println(eq(i32, in))
	fmt.Println(eq(in, i64))
}

, . false, , . , .

powerman :
func returnsError(t bool) error {
	var p *MyError = nil
	if t {
		p = ErrBad
	}
	return p // Will always return a non-nil error.
}
err := returnsError(false)
if err != nil {
  # 
}

nil nil, . FAQ .

. , ( ) . :
package main

import "fmt"

type storage struct {
	name string
}

var m map[string]storage

func main() {
	m = make(map[string]storage)
	m["pen"] = storage{name: "pen"}

	if data, ok := m["pen"]; ok {
		data.name = "-deleted-"
	}

	fmt.Println(m["pen"].name) // Output: pen
}

pen. :
package main

import "fmt"

type storage struct {
	name string
}

var m map[string]*storage

func main() {
	m = make(map[string]*storage)
	m["pen"] = &storage{name: "pen"}

	if data, ok := m["pen"]; ok {
		data.name = "-deleted-"
	}

	fmt.Println(m["pen"].name) // Output: -deleted-
}

"-deleted-", , , , «» .
?
:
m = make(map[string]storage)
:
m = make(map[string]*storage)


, ? , :
package main

import "fmt"

var globState string = "initial"

func getState() (string, bool) {
	return "working", true
}

func ini() {
	globState, ok := getState()
	if !ok {
		fmt.Println(globState)
	}
}

func main() {
	ini()
	fmt.Println("Current state: ", globState)
}

initial := . - ok. ,
globState, ok := getState()
globState = getState()

, IDE , , .

, PVS Go.

: , .


«»


, , . , . .
, :
make([]int, 50, 100)
new([100]int)[0:50]

, , new, . .

, :
var i int = 3
j := 6

, , var .

, Go .

«»


, :
result, err := function()
if err != nil {
    // ...
}

Go, . Go . result, err := function(), result, err = function(). , . — := = , .

«»


Go, , , , . .

- «», . 2018 Go 2.0, , . , «» .

. in not in. map :
if _, ok := elements["Un"]; ok {
}

— , , .


Go . . . SQL JOIN ORM GO (gorm) :
db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results)

ORM :
query := models.DB.LeftJoin("roles", "roles.id=user_roles.role_id").
  LeftJoin("users u", "u.id=user_roles.user_id").
  Where(`roles.name like ?`, name).Paginate(page, perpage)

ORM . .

:
a.GET("/users/{name}", func (c buffalo.Context) error {
  return c.Render(200, r.String(c.Param("name")))
})

- , .



, ? : . : , . . « » ( , ).


, - :
elements := map[string]map[string]string{
		"H": map[string]string{
			"name":  "Hydrogen",
			"state": "gas",
		},
        }

, ? - , . :
elements := map[string](map[string]string){
        }

, go fmt, . .


. . « » .
helgihabr , 1.9 sync.Map.


. Go , :
if result != 1 {
    t.Fatalf("result is not %v", 1)
    }

, , assert . : https://github.com/vizor-games/golang-unittest.

:
assert.NotEqual(t, result, 1, "invalid result")



. , «» . , . .
-:
string([]byte{'a'})

, :
y.(io.Reader)

. .
conversion, . static_cast ++.
type assertion . dynamic_cast ++.



vgo , JetBrains GoLand 2018.2, IDE :
vgo mod -vendor

, , . go2 .
1.11 . .


, Go, . , .
  • — , .
  • go build . autotools/Makefile. , . — , .
  • — , . , - .
  • — — 1 . 1 , 1 .
  • — .
  • — , IDE . Go, .
  • — Go , , . , Ruby .
  • . :
    package main
    
    import (
        "fmt"
        "os"
        "log"
    )
    
    func main() {
        file, err := os.Open("file.txt")
        if err != nil {
            log.Fatal(err)
        }
        defer file.Close()
    
      b, err := ioutil.ReadAll(file)
      fmt.Print(b)
    }
    
    defer file.Close()
    , , , . ( with).



Go . : , . , ( RTTI) , .
, , .


  • Go , . .
  • Go . - : « 5, 3». , — , 4. , .
  • . . . . .
  • STL , . , map array. .





Source: https://habr.com/ru/post/ar421259/


All Articles