Si está considerando comenzar a escribir en Go, esto es lo que debe saber

¿Tu mascota favorita escribe en Go y obtiene más que tú, pero aún no lo has hecho? No pierdas el tiempo ... Tal idea puede llegar al lector por la abundancia de artículos sobre Go. Algunas compañías incluso se ofrecen para volver a capacitarse en este idioma. Y si alguna vez pensaste en dominar un idioma, entonces quiero advertirte. Más bien, muestre cosas extrañas, trate de explicar por qué son, y luego usted mismo decidirá si necesita ir.

Guo es una C portátil


¿Para quién es este artículo?


El artículo está destinado principalmente a aquellas personas para quienes la expresividad del idioma es importante. Y al mismo tiempo para aquellos que quieren sentir el Go.
Yo mismo soy desarrollador de C ++ / Python y puedo decir que esta combinación es una de las mejores para dominar Go. Y aquí está el por qué:

  • Go se usa muy a menudo para escribir servicios de backend y muy raramente para todo lo demás. Hay dos pares más populares para lo mismo: Java / C # y Python / Ruby. Ir, en mi opinión, está dirigido específicamente a tomar una apuesta de un par Python / Ruby.
  • Go hereda su extraño comportamiento precisamente de los matices de la sintaxis C, que no están ocultos en el lenguaje. Dado que Go tiene puntos de rechazo claros hasta el punto de que a veces desea eliminar el compilador Go y olvidarlo, comprender los principios de C y el hecho de que Go es en cierto sentido un superconjunto de C hace posible suavizarlos.


¿Qué pasa con el par Java / C #? Go nunca es un competidor para ella, al menos mientras es joven (estamos hablando de Go versión 1.11).

Lo que no estará en el artículo


  • No diremos que Go es malo, porque no tiene la función X, como en el lenguaje Y. Cada idioma tiene sus propias reglas del juego, sus propios enfoques y sus fanáticos. Aunque a quien estoy engañando, por supuesto, tenemos que hablar de eso.
  • No compararemos los idiomas directamente interpretados y compilados.


Que va a pasar Solo casos específicos de incomodidad que el lenguaje ofrece en el trabajo.

Empezando


Una buena introducción al manual de idiomas es un breve libro en línea Introducción a la programación de Go . Leyendo que tropezarás con características extrañas con bastante rapidez. Primero, damos el primer lote de ellos:

Compilador extraño


Solo los soportes egipcios son compatibles
Solo se admiten paréntesis egipcios , es decir, el siguiente código no se compila:
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/es421259/


All Articles