Seu animal de estimação favorito escreve no Go e ganha mais do que você, mas ainda não o fez? Não perca tempo ... Essa idéia pode chegar ao leitor a partir da abundância de artigos no Go. Algumas empresas são até oferecidas a reciclagem neste idioma. E se você já pensou em dominar um idioma, quero avisá-lo. Em vez disso, mostre coisas estranhas, tente explicar por que elas são e então você mesmo decidirá se precisa do Go.

Para quem é este artigo?
O artigo é destinado principalmente àquelas pessoas para quem a expressividade da linguagem é importante. E ao mesmo tempo para aqueles que querem sentir o Go.
Eu próprio sou desenvolvedor de C ++ / Python e posso dizer que essa combinação é uma das melhores para dominar o Go. E aqui está o porquê:
- O Go é frequentemente usado para escrever serviços de back-end e muito raramente para todo o resto. Existem dois pares mais populares para o mesmo: Java / C # e Python / Ruby. Go, na minha opinião, visa especificamente a participação de um par Python / Ruby.
- Go herda seu comportamento estranho precisamente das nuances da sintaxe C, que não são óbvias escondidas na linguagem. Como o Go tem pontos de rejeição claros a tal ponto que às vezes você deseja remover o compilador Go e esquecê-lo, entender os princípios de C e o fato de que o Go é, em certo sentido, um superconjunto de C torna possível suavizá-los.
E o par Java / C #? O Go nunca é um concorrente para ela, pelo menos enquanto ele é jovem (estamos falando da versão 1.11 do Go).
O que não estará no artigo
- Não diremos que o Go é ruim, porque não possui o recurso X, como no idioma Y. Cada idioma tem suas próprias regras do jogo, suas próprias abordagens e seus fãs. Embora a quem eu esteja enganando, é claro que temos que conversar sobre isso.
- Não compararemos idiomas diretamente interpretados e compilados.
O que vai acontecer? Apenas casos específicos de desconforto que a linguagem produz no trabalho.
Introdução
Uma boa introdução ao manual de idiomas é um pequeno livro on-line
Introdução à programação em andamento . Lendo que você encontrará recursos estranhos rapidamente. Primeiro, damos o primeiro lote deles:
Stranger Compiler
Somente colchetes egípcios são suportadosApenas
colchetes egípcios são suportados, ou seja, o código a seguir não é compilado:
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. .