Hewan peliharaan favorit Anda menulis di Go dan mendapat lebih dari Anda, tetapi Anda masih belum? Jangan buang waktu ... Gagasan seperti itu mungkin datang ke pembaca dari banyaknya artikel di Go. Beberapa perusahaan bahkan ditawarkan untuk berlatih kembali dalam bahasa ini. Dan jika Anda pernah berpikir untuk menguasai bahasa, maka saya ingin memperingatkan Anda. Alih-alih, perlihatkan hal-hal aneh, coba jelaskan mengapa itu terjadi, dan kemudian Anda sendiri yang akan memutuskan apakah Anda perlu Pergi.

Untuk siapa artikel ini?
Artikel ini terutama ditujukan untuk orang-orang yang memiliki ekspresi bahasa yang penting. Dan pada saat yang sama bagi mereka yang ingin merasakan Go.
Saya sendiri adalah pengembang C ++ / Python dan saya dapat mengatakan bahwa kombinasi ini adalah salah satu yang terbaik untuk menguasai Go. Dan inilah alasannya:
- Go sangat sering digunakan untuk menulis layanan backend dan sangat jarang untuk yang lainnya. Ada dua pasangan yang lebih populer untuk hal yang sama: Java / C # dan Python / Ruby. Go, menurut saya, ditujukan khusus untuk mengambil pasak dari pasangan Python / Ruby.
- Go mewarisi perilaku anehnya justru dari nuansa sintaks C, yang tidak jelas tersembunyi dalam bahasa. Karena Go memiliki poin penolakan yang jelas sehingga Anda kadang-kadang ingin menghapus kompilator Go dan melupakannya, memahami prinsip-prinsip C dan fakta bahwa Go dalam arti tertentu adalah superset dari C memungkinkan untuk menghaluskannya.
Bagaimana dengan pasangan Java / C #? Go tidak pernah menjadi pesaing baginya, setidaknya saat ia masih muda (kita berbicara tentang Go versi 1.11).
Apa yang tidak akan ada di artikel
- Kami tidak akan mengatakan bahwa Go itu buruk, karena tidak memiliki fitur X, seperti dalam bahasa Y. Setiap bahasa memiliki aturan permainan sendiri, pendekatannya sendiri, dan penggemarnya. Meski yang saya tipu, tentu saja kita harus membicarakannya.
- Kami tidak akan membandingkan bahasa yang langsung ditafsirkan dan dikompilasi.
Apa yang akan terjadi Hanya kasus-kasus ketidaknyamanan spesifik yang disampaikan bahasa di tempat kerja.
Memulai
Pengantar yang baik untuk manual bahasa adalah buku online pendek
Pengantar Go Programming . Membaca bahwa Anda akan menemukan fitur aneh dengan cepat. Pertama, kami memberikan kelompok pertama dari mereka:
Penyusun Asing
Hanya kurung Mesir yang didukungHanya
tanda kurung Mesir yang didukung, mis. Kode berikut tidak dikompilasi:
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. .