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.

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ütztEs 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 . : , . , ( RTTI) , .
, , .
- Go , . .
- Go . - : « 5, 3». , — , 4. , .
- . . . . .
- STL , . , map array. .