Si vous envisagez de commencer à écrire sur Go, voici ce que vous devez savoir

Votre animal préféré écrit sur Go et obtient plus que vous, mais vous ne l'avez toujours pas fait? Ne perdez pas de temps ... Une telle idée peut venir au lecteur de l'abondance d'articles sur Go. Certaines entreprises se voient même proposer de se recycler dans cette langue. Et si vous avez déjà pensé à maîtriser une langue, alors je veux vous avertir. Montrez plutôt des choses étranges, essayez d'expliquer pourquoi elles le sont, puis vous déciderez vous-même si vous avez besoin de Go.

Guo est un C portable


À qui s'adresse cet article?


L'article est principalement destiné aux personnes pour lesquelles l'expressivité de la langue est importante. Et en même temps pour ceux qui veulent ressentir le Go.
Je suis moi-même développeur C ++ / Python et je peux dire que cette combinaison est l'une des meilleures pour maîtriser Go. Et voici pourquoi:

  • Go est très souvent utilisé pour écrire des services backend et très rarement pour tout le reste. Il existe deux paires plus populaires pour le même: Java / C # et Python / Ruby. Go, à mon avis, vise spécifiquement à prendre une participation dans une paire Python / Ruby.
  • Go hérite de son comportement étrange précisément des nuances de la syntaxe C, qui ne sont pas évidentes cachées dans le langage. Étant donné que Go a des points de rejet clairs à un point tel que vous souhaitez parfois supprimer le compilateur Go et l'oublier, comprendre les principes de C et le fait que Go est en quelque sorte un surensemble de C permet de les lisser.


Et la paire Java / C #? Go n'est jamais un concurrent pour elle, du moins quand il est jeune (on parle de Go version 1.11).

Ce qui ne sera pas dans l'article


  • Nous ne dirons pas que Go est mauvais, car il n'a pas la fonction X, comme dans le langage Y. Chaque langue a ses propres règles du jeu, ses propres approches et ses fans. Bien que je trompe, nous devons bien sûr en parler.
  • Nous ne comparerons pas les langues directement interprétées et compilées.


Que va-t-il se passer? Seuls les cas spécifiques d'inconfort que la langue délivre au travail.

Pour commencer


Une bonne introduction au manuel de langue est un court livre en ligne Introduction to Go Programming . En lisant que vous tomberez sur des caractéristiques étranges assez rapidement. Tout d'abord, nous en donnons le premier lot:

Stranger Compiler


Seuls les supports égyptiens sont pris en charge
Seuls les crochets égyptiens sont pris en charge, c'est-à-dire que le code suivant ne se compile pas:
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/fr421259/


All Articles