Jika Anda mempertimbangkan untuk mulai menulis di Go, inilah yang harus Anda ketahui

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.

Guo adalah C portabel


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 didukung
Hanya 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 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/id421259/


All Articles