Wenn Sie ĂĽberlegen, mit dem Schreiben auf Go zu beginnen, sollten Sie Folgendes wissen

Ihr Lieblingshaustier schreibt auf Go und bekommt mehr als Sie, aber Sie haben es immer noch nicht? Verschwenden Sie keine Zeit ... Eine solche Idee kann dem Leser aus der Fülle von Artikeln auf Go kommen. Einige Unternehmen werden sogar angeboten, sich in dieser Sprache weiterzubilden. Und wenn Sie jemals darüber nachgedacht haben, eine Sprache zu beherrschen, dann möchte ich Sie warnen. Zeigen Sie lieber seltsame Dinge, versuchen Sie zu erklären, warum sie sind, und dann entscheiden Sie selbst, ob Sie Go benötigen.

Guo ist ein tragbares C.


FĂĽr wen ist dieser Artikel?


Der Artikel richtet sich in erster Linie an Personen, fĂĽr die die Ausdruckskraft der Sprache wichtig ist. Und zur gleichen Zeit fĂĽr diejenigen, die das Go fĂĽhlen wollen.
Ich selbst bin ein C ++ / Python-Entwickler und ich kann sagen, dass diese Kombination eine der besten ist, um Go zu beherrschen. Und hier ist warum:

  • Go wird sehr oft zum Schreiben von Backend-Diensten verwendet und sehr selten fĂĽr alles andere. Es gibt zwei weitere beliebte Paare fĂĽr dasselbe: Java / C # und Python / Ruby. Go zielt meiner Meinung nach speziell darauf ab, einen Anteil von einem Python / Ruby-Paar zu ĂĽbernehmen.
  • Go erbt sein seltsames Verhalten genau von den Nuancen der C-Syntax, die in der Sprache nicht offensichtlich verborgen sind. Da Go eindeutige Ablehnungspunkte in einem solchen AusmaĂź aufweist, dass Sie den Go-Compiler manchmal entfernen und vergessen möchten, können Sie sie verstehen, wenn Sie die Prinzipien von C und die Tatsache verstehen, dass Go in gewissem Sinne eine Obermenge von C ist.


Was ist mit dem Java / C # -Paar? Go ist fĂĽr sie niemals eine Konkurrentin, zumindest nicht in jungen Jahren (wir sprechen ĂĽber Go Version 1.11).

Was wird nicht in dem Artikel sein


  • Wir werden nicht sagen, dass Go schlecht ist, weil es nicht die X-Funktion wie in der Y-Sprache hat. Jede Sprache hat ihre eigenen Spielregeln, ihre eigenen Ansätze und ihre Fans. Obwohl wen ich täusche, mĂĽssen wir natĂĽrlich darĂĽber reden.
  • Wir werden keine direkt interpretierten und kompilierten Sprachen vergleichen.


Was wird passieren? Nur bestimmte Fälle von Unbehagen, die die Sprache bei der Arbeit verursacht.

Erste Schritte


Eine gute EinfĂĽhrung in das Sprachhandbuch ist ein kurzes Online-Buch EinfĂĽhrung in die Go-Programmierung . Wenn Sie lesen, dass Sie ziemlich schnell auf seltsame Funktionen stoĂźen werden. Zuerst geben wir die erste Charge von ihnen:

Fremder Compiler


Es werden nur ägyptische Klammern unterstützt
Es werden nur ägyptische Klammern unterstützt, d. H. Der folgende Code wird nicht kompiliert:
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/de421259/


All Articles